Anda harus memperbarui jawaban Anda dengan sebuah contoh, misalnya typeof (T) .IsAssignableFrom (typeof (IMyInterface))
Dr. Andrew Burnett-Thompson
Tidak dilakukan nikeee; jawaban lama masih ada. :) Saya mengambil beberapa detik untuk mencari tahu apa yang salah. Bagaimanapun, +1, fitur bagus lagi dari kerangka kerja .net.
Samuel
Nyatanya, cara Anda menyebutkannya seperti yang saya alami beberapa waktu lalu. Saya mengoreksi yang ini. Lihat komentar sebelumnya. T inherits Usebenarnya diterjemahkan menjadi typeof(T).IsAssignableFrom(typeof(U)).
nikeee
3
Meskipun ini hampir berhasil, ada masalah di mana jika Tdibatasi ke beberapa jenis lain TOther, kemudian ketika dijalankan, typeof(T)akan benar-benar mengevaluasi ke typeof(TOther)dan bukan jenis apa pun yang Tsebenarnya Anda lewati, dan dalam kasus itu, typeof(SomeInterface).IsAssignableFrom(typeof(T))akan gagal (dengan asumsi TOthertidak juga diterapkan SomeInterface), meskipun jenis beton Anda benar-benar diterapkan SomeInterface.
Dave Cousineau
1
Dalam inti .net IsAssignableFromdari TypeInfokelas hanya menerima TypeInfo karena hanya argumen itu, sehingga sampel harus berikut:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Jika Anda ingin memeriksa selama kompilasi: Kesalahan jika TTIDAK menerapkan antarmuka / kelas yang diinginkan, Anda dapat menggunakan batasan berikut
publicvoidMyRestrictedMethod<T>()where T :MyInterface1,MyInterface2,MySuperClass{//Code of my method here, clean without any check for type constraints.}
Return Value:true jika cdan arus Typemewakili tipe yang sama, atau jika arus Typeberada dalam hierarki pewarisan c, atau jika arus Typeadalah interfaceyang cmengimplementasikan, atau jika cadalah tipe parameter generik dan arus Typemewakili salah satu batasan c, atau jika cmewakili tipe nilai dan arus Typemewakili Nullable<c>( Nullable(Of c)dalam Visual Basic). falsejika tidak ada dari kondisi ini true, atau jika cada null.
Jika Employee IsAssignableFrom Tkemudian Tmewarisi dari Employee.
Penggunaan
typeof(T).IsAssignableFrom(typeof(Employee))
kembali truehanya jika salah satunya
Tdan Employeemewakili tipe yang sama; atau,
Employeemewarisi dari T.
Ini mungkin penggunaan yang dimaksudkan dalam beberapa kasus, tetapi untuk pertanyaan asli (dan penggunaan yang lebih umum), untuk menentukan kapan Tmewarisi atau mengimplementasikan beberapa class/ interface, gunakan:
karena Anda benar-benar dapat menetapkan dari sebuah contoh DerivedTypeke sebuah contoh dari BaseType:
DerivedType childInstance =newDerivedType();BaseType parentInstance = childInstance;// okay, assigning base from derived
childInstance =(DerivedType) parentInstance;// not okay, assigning derived from base
Meskipun IsAssignableFrom adalah cara terbaik seperti yang dinyatakan orang lain, jika Anda hanya perlu memeriksa apakah kelas mewarisi dari kelas lain, typeof(T).BaseType == typeof(SomeClass)lakukan pekerjaan itu juga.
Itu berfungsi kecuali SomeClasstidak secara langsung berasal dari BaseClass.
Suncat2000
0
Cara alternatif untuk mengetahui apakah suatu objek omewarisi kelas atau mengimplementasikan antarmuka adalah dengan menggunakan isdanas operator .
Jika Anda hanya ingin mengetahui apakah suatu objek mewarisi kelas atau mengimplementasikan antarmuka, isoperator akan mengembalikan hasil boolean:
bool isCompatibleType =(o isBaseType|| o isIInterface);
Jika Anda ingin menggunakan kelas yang diwariskan atau antarmuka yang diimplementasikan setelah pengujian Anda, asoperator akan melakukan transmisi yang aman, mengembalikan referensi ke kelas yang diwariskan atau antarmuka yang diimplementasikan jika kompatibel atau null jika tidak kompatibel:
BaseType b = o asBaseType;// Null if d does not inherit from BaseType.IInterface i = o asIInterface;// Null if d does not implement IInterface.
Jika Anda hanya memiliki tipe T, gunakan jawaban @ nikeee.
Jawaban:
Ada Metode yang disebut Type.IsAssignableFrom () .
Untuk memeriksa apakah
T
mewarisi / mengimplementasikanEmployee
:Jika Anda menargetkan .NET Core, metode telah dipindahkan ke TypeInfo:
sumber
T inherits U
sebenarnya diterjemahkan menjaditypeof(T).IsAssignableFrom(typeof(U))
.T
dibatasi ke beberapa jenis lainTOther
, kemudian ketika dijalankan,typeof(T)
akan benar-benar mengevaluasi ketypeof(TOther)
dan bukan jenis apa pun yangT
sebenarnya Anda lewati, dan dalam kasus itu,typeof(SomeInterface).IsAssignableFrom(typeof(T))
akan gagal (dengan asumsiTOther
tidak juga diterapkanSomeInterface
), meskipun jenis beton Anda benar-benar diterapkanSomeInterface
.IsAssignableFrom
dariTypeInfo
kelas hanya menerima TypeInfo karena hanya argumen itu, sehingga sampel harus berikut:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Anda dapat menggunakan batasan di kelas.
Lihat http://msdn.microsoft.com/en-us/library/d5x73970.aspx
sumber
Jika Anda ingin memeriksa selama kompilasi: Kesalahan jika
T
TIDAK menerapkan antarmuka / kelas yang diinginkan, Anda dapat menggunakan batasan berikutSaya harap itu membantu.
sumber
Sintaks yang benar adalah
Dokumentasi
sumber
Penjelasan
Jika
Employee IsAssignableFrom T
kemudianT
mewarisi dariEmployee
.Penggunaan
kembali
true
hanya jika salah satunyaT
danEmployee
mewakili tipe yang sama; atau,Employee
mewarisi dariT
.Ini mungkin penggunaan yang dimaksudkan dalam beberapa kasus, tetapi untuk pertanyaan asli (dan penggunaan yang lebih umum), untuk menentukan kapan
T
mewarisi atau mengimplementasikan beberapaclass
/interface
, gunakan:sumber
Yang dimaksud setiap orang adalah:
karena Anda benar-benar dapat menetapkan dari sebuah contoh
DerivedType
ke sebuah contoh dariBaseType
:kapan
Dan beberapa contoh konkret jika Anda kesulitan membungkus kepala Anda di sekitarnya:
(melalui LinqPad, karenanya
HorizontalRun
danDump
)Hasil
dan
sumber
Saya percaya sintaksnya adalah:
typeof(Employee).IsAssignableFrom(typeof(T));
sumber
Meskipun IsAssignableFrom adalah cara terbaik seperti yang dinyatakan orang lain, jika Anda hanya perlu memeriksa apakah kelas mewarisi dari kelas lain,
typeof(T).BaseType == typeof(SomeClass)
lakukan pekerjaan itu juga.sumber
SomeClass
tidak secara langsung berasal dariBaseClass
.Cara alternatif untuk mengetahui apakah suatu objek
o
mewarisi kelas atau mengimplementasikan antarmuka adalah dengan menggunakanis
danas
operator .Jika Anda hanya ingin mengetahui apakah suatu objek mewarisi kelas atau mengimplementasikan antarmuka,
is
operator akan mengembalikan hasil boolean:Jika Anda ingin menggunakan kelas yang diwariskan atau antarmuka yang diimplementasikan setelah pengujian Anda,
as
operator akan melakukan transmisi yang aman, mengembalikan referensi ke kelas yang diwariskan atau antarmuka yang diimplementasikan jika kompatibel atau null jika tidak kompatibel:Jika Anda hanya memiliki tipe
T
, gunakan jawaban @ nikeee.sumber