Sie sollten Ihre Antwort mit einem Beispiel aktualisieren, z. B. typeof (T) .IsAssignableFrom (typeof (IMyInterface))
Dr. Andrew Burnett-Thompson
Nicht gemacht Nikeee; Die alte Antwort ist immer noch da. :) Ich habe ein paar Sekunden gebraucht, um herauszufinden, was los ist. Auf jeden Fall +1, wieder eine nette Funktion des .net-Frameworks.
Samuel
In der Tat ist die Art, wie Sie es erwähnen, die Art, wie ich es vor einiger Zeit hatte. Ich habe das korrigiert. Siehe vorherige Kommentare. T inherits Uübersetzt tatsächlich zu typeof(T).IsAssignableFrom(typeof(U)).
Nikeee
2
Während dies fast funktioniert, gibt es ein Problem, bei dem, wenn Tes auf einen anderen Typ beschränkt ist TOther, bei der Ausführung typeof(T)tatsächlich der typeof(TOther)Typ ausgewertet wird und nicht der Typ, den TSie tatsächlich übergeben haben, und in diesem Fall typeof(SomeInterface).IsAssignableFrom(typeof(T))fehlschlägt (vorausgesetzt TOther, nicht implementiert SomeInterface). obwohl Ihr konkreter Typ implementiert hat SomeInterface.
Dave Cousineau
1
In .net akzeptiert der Kern IsAssignableFromder TypeInfoKlasse nur TypeInfo als einziges Argument, daher sollte das Beispiel das folgende sein:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Bis zum
31
Sie können Einschränkungen für die Klasse verwenden.
Wenn Sie während der Kompilierung überprüfen möchten: Fehler, wenn die gewünschte Schnittstelle / Klasse TNICHT implementiert wird, können Sie die folgende Einschränkung verwenden
publicvoidMyRestrictedMethod<T>()where T :MyInterface1,MyInterface2,MySuperClass{//Code of my method here, clean without any check for type constraints.}
Rückgabewert:true wenn , cund der Strom Typerepräsentiert den gleichen Typen ist , oder wenn der Strom Typeist in der Vererbungshierarchie c, oder wenn der Strom Typeist , interfacedass cWerkzeuge, oder wenn cein generischer Typ - Parameter und der Strom Typeist eine der Einschränkungen coder if crepräsentiert einen Werttyp und der aktuelle Typerepräsentiert Nullable<c>( Nullable(Of c)in Visual Basic). falsewenn keine dieser Bedingungen erfüllt trueist oder wenn dies der Fall cist null.
Wenn Employee IsAssignableFrom Tdann Terbt von Employee.
Die Verwendung
typeof(T).IsAssignableFrom(typeof(Employee))
Gibt truenur zurück, wenn einer der beiden
Tund Employeerepräsentieren den gleichen Typ; oder,
Employeeerbt von T.
Dies kann in einigen Fällen eine beabsichtigte Verwendung sein , aber für die ursprüngliche Frage (und die häufigere Verwendung), um zu bestimmen, wann Teinige class/ geerbt oder implementiert werden interface, verwenden Sie:
weil Sie buchstäblich von einer Instanz von a DerivedTypezu einer Instanz von a zuweisen können BaseType:
DerivedType childInstance =newDerivedType();BaseType parentInstance = childInstance;// okay, assigning base from derived
childInstance =(DerivedType) parentInstance;// not okay, assigning derived from base
Obwohl IsAssignableFrom der beste Weg ist, wie andere angegeben haben, typeof(T).BaseType == typeof(SomeClass)erledigt der Job auch , wenn Sie nur überprüfen müssen, ob eine Klasse von einer anderen erbt .
Das funktioniert, es SomeClasssei denn, es ist nicht direkt abgeleitet von BaseClass.
Suncat2000
0
Alternative Möglichkeiten, um festzustellen, ob ein Objekt oeine Klasse erbt oder eine Schnittstelle implementiert, sind die Operatoren isund as.
Wenn Sie nur wissen möchten, ob ein Objekt eine Klasse erbt oder eine Schnittstelle implementiert, gibt der isOperator ein boolesches Ergebnis zurück:
bool isCompatibleType =(o isBaseType|| o isIInterface);
Wenn Sie die geerbte Klasse oder die implementierte Schnittstelle nach Ihrem Test verwenden möchten, führt der asOperator eine sichere Umwandlung durch und gibt einen Verweis auf die geerbte Klasse oder die implementierte Schnittstelle zurück, falls kompatibel, oder null, wenn nicht kompatibel:
BaseType b = o asBaseType;// Null if d does not inherit from BaseType.IInterface i = o asIInterface;// Null if d does not implement IInterface.
Wenn Sie nur den Typ haben T, verwenden Sie die Antwort von @ nikeee.
Antworten:
Es gibt eine Methode namens Type.IsAssignableFrom () .
So überprüfen Sie, ob
T
erbt / implementiertEmployee
:Wenn Sie auf .NET Core abzielen, wurde die Methode nach TypeInfo verschoben:
quelle
T inherits U
übersetzt tatsächlich zutypeof(T).IsAssignableFrom(typeof(U))
.T
es auf einen anderen Typ beschränkt istTOther
, bei der Ausführungtypeof(T)
tatsächlich dertypeof(TOther)
Typ ausgewertet wird und nicht der Typ, denT
Sie tatsächlich übergeben haben, und in diesem Falltypeof(SomeInterface).IsAssignableFrom(typeof(T))
fehlschlägt (vorausgesetztTOther
, nicht implementiertSomeInterface
). obwohl Ihr konkreter Typ implementiert hatSomeInterface
.IsAssignableFrom
derTypeInfo
Klasse nur TypeInfo als einziges Argument, daher sollte das Beispiel das folgende sein:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Sie können Einschränkungen für die Klasse verwenden.
Schauen Sie sich http://msdn.microsoft.com/en-us/library/d5x73970.aspx an
quelle
Wenn Sie während der Kompilierung überprüfen möchten: Fehler, wenn die gewünschte Schnittstelle / Klasse
T
NICHT implementiert wird, können Sie die folgende Einschränkung verwendenIch hoffe das hilft.
quelle
Die richtige Syntax lautet
Dokumentation
Quelle
Erläuterung
Wenn
Employee IsAssignableFrom T
dannT
erbt vonEmployee
.Die Verwendung
Gibt
true
nur zurück, wenn einer der beidenT
undEmployee
repräsentieren den gleichen Typ; oder,Employee
erbt vonT
.Dies kann in einigen Fällen eine beabsichtigte Verwendung sein , aber für die ursprüngliche Frage (und die häufigere Verwendung), um zu bestimmen, wann
T
einigeclass
/ geerbt oder implementiert werdeninterface
, verwenden Sie:quelle
Was jeder wirklich meint ist:
weil Sie buchstäblich von einer Instanz von a
DerivedType
zu einer Instanz von a zuweisen könnenBaseType
:wann
Und einige konkrete Beispiele, wenn Sie Probleme haben, Ihren Kopf darum zu wickeln:
(über LinqPad, daher das
HorizontalRun
undDump
)Ergebnisse
und
quelle
Ich glaube, die Syntax lautet:
typeof(Employee).IsAssignableFrom(typeof(T));
quelle
Obwohl IsAssignableFrom der beste Weg ist, wie andere angegeben haben,
typeof(T).BaseType == typeof(SomeClass)
erledigt der Job auch , wenn Sie nur überprüfen müssen, ob eine Klasse von einer anderen erbt .quelle
SomeClass
sei denn, es ist nicht direkt abgeleitet vonBaseClass
.Alternative Möglichkeiten, um festzustellen, ob ein Objekt
o
eine Klasse erbt oder eine Schnittstelle implementiert, sind die Operatorenis
undas
.Wenn Sie nur wissen möchten, ob ein Objekt eine Klasse erbt oder eine Schnittstelle implementiert, gibt der
is
Operator ein boolesches Ergebnis zurück:Wenn Sie die geerbte Klasse oder die implementierte Schnittstelle nach Ihrem Test verwenden möchten, führt der
as
Operator eine sichere Umwandlung durch und gibt einen Verweis auf die geerbte Klasse oder die implementierte Schnittstelle zurück, falls kompatibel, oder null, wenn nicht kompatibel:Wenn Sie nur den Typ haben
T
, verwenden Sie die Antwort von @ nikeee.quelle