Rupanya tidak.
Berikut opsinya:
Type.IsSubclassOf
Seperti yang sudah Anda ketahui, ini tidak akan berfungsi jika kedua jenisnya sama, inilah contoh program LINQPad yang menunjukkan:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Keluaran:
True
False
Yang menunjukkan bahwa itu Derivedadalah subkelas dari Base, tetapi itu Base(jelas) bukan subkelas dari itu sendiri.
Type.IsAssignableFrom
Sekarang, ini akan menjawab pertanyaan khusus Anda, tetapi itu juga akan memberi Anda positif palsu. Seperti yang ditunjukkan oleh Eric Lippert dalam komentar, sementara metode tersebut memang akan kembali Trueuntuk dua pertanyaan di atas, itu juga akan kembali Trueuntuk ini, yang mungkin tidak Anda inginkan:
void Main()
{
typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}
public class Base { }
public class Derived : Base { }
Di sini Anda mendapatkan output berikut:
True
True
True
Terakhir Trueada akan menunjukkan, jika metode hanya menjawab pertanyaan yang diajukan, yang uint[]mewarisi dari int[]atau bahwa mereka adalah tipe yang sama, yang jelas bukan itu masalahnya.
Jadi IsAssignableFromtidak sepenuhnya benar juga.
is dan as
"Masalah" dengan isdan asdalam konteks pertanyaan Anda adalah bahwa mereka akan mengharuskan Anda untuk beroperasi pada objek dan menulis salah satu jenis secara langsung dalam kode, dan tidak bekerja dengan Typeobjek.
Dengan kata lain, ini tidak dapat dikompilasi:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
ini juga tidak akan:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
ini juga tidak akan:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Kesimpulan
Meskipun metode di atas mungkin sesuai dengan kebutuhan Anda, satu-satunya jawaban yang benar untuk pertanyaan Anda (seperti yang saya lihat) adalah bahwa Anda akan memerlukan pemeriksaan tambahan:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
yang tentu saja lebih masuk akal dalam suatu metode:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}