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 Derived
adalah 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 True
untuk dua pertanyaan di atas, itu juga akan kembali True
untuk 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 True
ada 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 IsAssignableFrom
tidak sepenuhnya benar juga.
is
dan as
"Masalah" dengan is
dan as
dalam 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 Type
objek.
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;
}
IsInstanceOfType
cocok dengan ini?sumber
Anda harus mencoba menggunakan Type.IsAssignableFrom sebagai gantinya.
sumber
Jika Anda mencoba melakukannya di proyek PCL Xamarin Forms, solusi di atas menggunakan
IsAssignableFrom
memberikan kesalahan:karena
IsAssignableFrom
memintaTypeInfo
objek. Anda dapat menggunakanGetTypeInfo()
metode ini dariSystem.Reflection
:typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
sumber
Saya memposting jawaban ini dengan harapan seseorang berbagi dengan saya jika dan mengapa itu adalah ide yang buruk. Dalam aplikasi saya, saya memiliki properti Tipe yang ingin saya periksa untuk memastikan itu adalah typeof (A) atau typeof (B), di mana B adalah kelas yang berasal dari A. Jadi kode saya:
Saya merasa mungkin agak naif di sini sehingga umpan balik akan diterima.
sumber