cela semble fonctionner ... si (typeof (TestClass) .IsAssignableFrom (typeof (T))), quelqu'un pourrait-il confirmer mes soupçons? Merci!
user1229895
Je suis absolument sûr que cette réponse est répétée plusieurs fois!
Felix K.
3
Felix K Même si cette réponse a été répétée plusieurs fois, elle aide aussi beaucoup de gars à plusieurs reprises;) ... comme moi il y a cinq minutes :)
vous devriez mettre à jour votre réponse avec un exemple, par exemple typeof (T) .IsAssignableFrom (typeof (IMyInterface))
Dr. Andrew Burnett-Thompson
Pas fait nikeee; la vieille réponse est toujours là. :) J'ai pris quelques secondes pour comprendre ce qui ne va pas. En tout cas, +1, une nouvelle fonctionnalité intéressante du framework .net.
Samuel
En fait, la façon dont vous parlez est la façon dont je l'avais fait il y a quelque temps. J'ai corrigé celui-ci. Voir les commentaires précédents. T inherits Use traduit en fait par typeof(T).IsAssignableFrom(typeof(U)).
nikeee
3
Bien que cela fonctionne presque, il y a un problème où if Test contraint à un autre type TOther, puis lorsqu'il est exécuté, il typeof(T)sera en fait évalué à typeof(TOther)et non au type que Tvous avez réellement passé, et dans ce cas, typeof(SomeInterface).IsAssignableFrom(typeof(T))échouera (en supposant qu'il TOtherne soit pas également implémenté SomeInterface), même si votre type de béton a été implémenté SomeInterface.
Dave Cousineau
1
Dans .net, le noyau IsAssignableFromde la TypeInfoclasse n'accepte que TypeInfo comme seul argument, donc l'exemple doit être le suivant:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
To Ka
33
Vous pouvez utiliser des contraintes sur la classe.
Si vous souhaitez vérifier lors de la compilation: Erreur si si Tn'implémente PAS l'interface / la classe souhaitée, vous pouvez utiliser la contrainte suivante
publicvoidMyRestrictedMethod<T>()where T :MyInterface1,MyInterface2,MySuperClass{//Code of my method here, clean without any check for type constraints.}
Valeur de retour:true si cet le courant Typereprésentent le même type, ou si le courant Typeest dans la hiérarchie d'héritage de c, ou si le courant Typeest un interfacequi cimplémente, ou si cest un paramètre de type générique et le courant Typereprésente l'une des contraintes de c, ou if creprésente un type valeur et le courant Typereprésente Nullable<c>( Nullable(Of c)dans Visual Basic). falsesi aucune de ces conditions ne l'est true, ou si elle l' cest null.
Si Employee IsAssignableFrom Talors Thérite de Employee.
L'usage
typeof(T).IsAssignableFrom(typeof(Employee))
retourne trueuniquement lorsque soit
Tet Employeereprésentent le même type; ou,
Employeehérite de T.
Cela peut être une utilisation prévue dans certains cas, mais pour la question d'origine (et l'utilisation la plus courante), pour déterminer quand Thérite ou implémente certains class/ interface, utilisez:
car vous pouvez littéralement attribuer d' une instance de a DerivedTypeà une instance de a BaseType:
DerivedType childInstance =newDerivedType();BaseType parentInstance = childInstance;// okay, assigning base from derived
childInstance =(DerivedType) parentInstance;// not okay, assigning derived from base
Bien que IsAssignableFrom soit le meilleur moyen, comme d'autres l'ont indiqué, si vous avez seulement besoin de vérifier si une classe hérite d'une autre, typeof(T).BaseType == typeof(SomeClass)fait également le travail.
Cela fonctionne à moins qu'il SomeClassne soit directement dérivé de BaseClass.
Suncat2000
0
Une autre façon de savoir si un objet ohérite d'une classe ou implémente une interface consiste à utiliser les opérateurs iset as.
Si vous voulez savoir uniquement si un objet hérite d'une classe ou implémente une interface, l' isopérateur renverra un résultat booléen:
bool isCompatibleType =(o isBaseType|| o isIInterface);
Si vous souhaitez utiliser la classe héritée ou l'interface implémentée après votre test, l' asopérateur effectuera un cast sécurisé, renvoyant une référence à la classe héritée ou à l'interface implémentée si compatible ou null si non compatible:
BaseType b = o asBaseType;// Null if d does not inherit from BaseType.IInterface i = o asIInterface;// Null if d does not implement IInterface.
Si vous n'avez que le type T, utilisez la réponse de @ nikeee.
Réponses:
Il existe une méthode appelée Type.IsAssignableFrom () .
Pour vérifier si
T
hérite / implémenteEmployee
:Si vous ciblez .NET Core, la méthode a été déplacée vers TypeInfo:
la source
T inherits U
se traduit en fait partypeof(T).IsAssignableFrom(typeof(U))
.T
est contraint à un autre typeTOther
, puis lorsqu'il est exécuté, iltypeof(T)
sera en fait évalué àtypeof(TOther)
et non au type queT
vous avez réellement passé, et dans ce cas,typeof(SomeInterface).IsAssignableFrom(typeof(T))
échouera (en supposant qu'ilTOther
ne soit pas également implémentéSomeInterface
), même si votre type de béton a été implémentéSomeInterface
.IsAssignableFrom
de laTypeInfo
classe n'accepte que TypeInfo comme seul argument, donc l'exemple doit être le suivant:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Vous pouvez utiliser des contraintes sur la classe.
Jetez un œil à http://msdn.microsoft.com/en-us/library/d5x73970.aspx
la source
Si vous souhaitez vérifier lors de la compilation: Erreur si si
T
n'implémente PAS l'interface / la classe souhaitée, vous pouvez utiliser la contrainte suivanteJ'espère que cela aide.
la source
La syntaxe correcte est
Documentation
la source
Explication
Si
Employee IsAssignableFrom T
alorsT
hérite deEmployee
.L'usage
retourne
true
uniquement lorsque soitT
etEmployee
représentent le même type; ou,Employee
hérite deT
.Cela peut être une utilisation prévue dans certains cas, mais pour la question d'origine (et l'utilisation la plus courante), pour déterminer quand
T
hérite ou implémente certainsclass
/interface
, utilisez:la source
Ce que tout le monde veut vraiment dire, c'est:
car vous pouvez littéralement attribuer d' une instance de a
DerivedType
à une instance de aBaseType
:quand
Et quelques exemples concrets si vous avez du mal à vous y mettre la tête:
(via LinqPad, d'où le
HorizontalRun
etDump
)Résultats
et
la source
Je pense que la syntaxe est:
typeof(Employee).IsAssignableFrom(typeof(T));
la source
Bien que IsAssignableFrom soit le meilleur moyen, comme d'autres l'ont indiqué, si vous avez seulement besoin de vérifier si une classe hérite d'une autre,
typeof(T).BaseType == typeof(SomeClass)
fait également le travail.la source
SomeClass
ne soit directement dérivé deBaseClass
.Une autre façon de savoir si un objet
o
hérite d'une classe ou implémente une interface consiste à utiliser les opérateursis
etas
.Si vous voulez savoir uniquement si un objet hérite d'une classe ou implémente une interface, l'
is
opérateur renverra un résultat booléen:Si vous souhaitez utiliser la classe héritée ou l'interface implémentée après votre test, l'
as
opérateur effectuera un cast sécurisé, renvoyant une référence à la classe héritée ou à l'interface implémentée si compatible ou null si non compatible:Si vous n'avez que le type
T
, utilisez la réponse de @ nikeee.la source