debe actualizar su respuesta con un ejemplo, por ejemplo, typeof (T) .IsAssignableFrom (typeof (IMyInterface))
Dr. Andrew Burnett-Thompson
Nikeee no hecho; la vieja respuesta sigue ahí. :) Tomé un par de segundos para averiguar qué estaba mal. De todos modos, +1, buena característica nuevamente del marco .net.
Samuel
De hecho, la forma en que mencionas es la forma en que lo tuve hace algún tiempo. Corregí este. Ver comentarios anteriores. T inherits Uen realidad se traduce en typeof(T).IsAssignableFrom(typeof(U)).
nikeee
3
Si bien esto casi funciona, existe un problema en el que si Testá restringido a algún otro tipo TOther, luego, cuando se ejecuta, en typeof(T)realidad se evaluará typeof(TOther)y no en el tipo Tque haya pasado realmente, y en ese caso, typeof(SomeInterface).IsAssignableFrom(typeof(T))fallará (suponiendo TOtherque no se implementa también SomeInterface), a pesar de que su tipo concreto se implementó SomeInterface.
Dave Cousineau
1
En .net, el núcleo IsAssignableFromde la TypeInfoclase solo acepta TypeInfo como su único argumento, por lo que la muestra debe ser la siguiente:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Si desea verificar durante la compilación: Error si TNO implementa la interfaz / clase deseada, puede usar la siguiente restricción
publicvoidMyRestrictedMethod<T>()where T :MyInterface1,MyInterface2,MySuperClass{//Code of my method here, clean without any check for type constraints.}
Valor de retorno:true si cy el actual Typerepresentan el mismo tipo, o si el actual Typeestá en la jerarquía de herencia de c, o si el actual Typees un interfaceque cimplementa, o si ces un parámetro de tipo genérico y el actual Typerepresenta una de las restricciones de c, o si crepresenta un tipo de valor y el actual Typerepresenta Nullable<c>( Nullable(Of c)en Visual Basic). falsesi ninguna de estas condiciones es true, o si ces null.
Si Employee IsAssignableFrom Tluego Thereda de Employee.
El uso
typeof(T).IsAssignableFrom(typeof(Employee))
regresa truesolo cuando
Ty Employeerepresentan el mismo tipo; o,
Employeehereda de T.
Esto puede ser un uso intencionado en algún caso, pero para la pregunta original (y el uso más común), para determinar cuándo Thereda o implementa algunos class/ interface, use:
porque literalmente puede asignar desde una instancia de a DerivedTypea una instancia de a BaseType:
DerivedType childInstance =newDerivedType();BaseType parentInstance = childInstance;// okay, assigning base from derived
childInstance =(DerivedType) parentInstance;// not okay, assigning derived from base
Aunque IsAssignableFrom es la mejor manera, como han dicho otros, si solo necesita verificar si una clase hereda de otra, typeof(T).BaseType == typeof(SomeClass)también funciona.
Eso funciona a menos SomeClassque no se derive directamente de BaseClass.
Suncat2000
0
Las formas alternativas de saber si un objeto ohereda una clase o implementa una interfaz es usar los operadores isy as.
Si solo desea saber si un objeto hereda una clase o implementa una interfaz, el isoperador devolverá un resultado booleano:
bool isCompatibleType =(o isBaseType|| o isIInterface);
Si desea utilizar la clase heredada o la interfaz implementada después de su prueba, el asoperador realizará una conversión segura, devolviendo una referencia a la clase heredada o la interfaz implementada si es compatible o nula si no es 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 solo tiene el tipo T, use la respuesta de @ nikeee.
Respuestas:
Existe un método llamado Type.IsAssignableFrom () .
Para comprobar si
T
hereda / implementaEmployee
:Si tiene como destino .NET Core, el método se ha trasladado a TypeInfo:
fuente
T inherits U
en realidad se traduce entypeof(T).IsAssignableFrom(typeof(U))
.T
está restringido a algún otro tipoTOther
, luego, cuando se ejecuta, entypeof(T)
realidad se evaluarátypeof(TOther)
y no en el tipoT
que haya pasado realmente, y en ese caso,typeof(SomeInterface).IsAssignableFrom(typeof(T))
fallará (suponiendoTOther
que no se implementa tambiénSomeInterface
), a pesar de que su tipo concreto se implementóSomeInterface
.IsAssignableFrom
de laTypeInfo
clase solo acepta TypeInfo como su único argumento, por lo que la muestra debe ser la siguiente:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Puede usar restricciones en la clase.
Eche un vistazo a http://msdn.microsoft.com/en-us/library/d5x73970.aspx
fuente
Si desea verificar durante la compilación: Error si
T
NO implementa la interfaz / clase deseada, puede usar la siguiente restricciónEspero que eso ayude.
fuente
La sintaxis correcta es
Documentación
fuente
Explicación
Si
Employee IsAssignableFrom T
luegoT
hereda deEmployee
.El uso
regresa
true
solo cuandoT
yEmployee
representan el mismo tipo; o,Employee
hereda deT
.Esto puede ser un uso intencionado en algún caso, pero para la pregunta original (y el uso más común), para determinar cuándo
T
hereda o implementa algunosclass
/interface
, use:fuente
Lo que todos realmente quieren decir es:
porque literalmente puede asignar desde una instancia de a
DerivedType
a una instancia de aBaseType
:cuando
Y algunos ejemplos concretos si tiene problemas para entenderlo:
(a través de LinqPad, de ahí el
HorizontalRun
yDump
)Resultados
y
fuente
Creo que la sintaxis es:
typeof(Employee).IsAssignableFrom(typeof(T));
fuente
Aunque IsAssignableFrom es la mejor manera, como han dicho otros, si solo necesita verificar si una clase hereda de otra,
typeof(T).BaseType == typeof(SomeClass)
también funciona.fuente
SomeClass
que no se derive directamente deBaseClass
.Las formas alternativas de saber si un objeto
o
hereda una clase o implementa una interfaz es usar los operadoresis
yas
.Si solo desea saber si un objeto hereda una clase o implementa una interfaz, el
is
operador devolverá un resultado booleano:Si desea utilizar la clase heredada o la interfaz implementada después de su prueba, el
as
operador realizará una conversión segura, devolviendo una referencia a la clase heredada o la interfaz implementada si es compatible o nula si no es compatible:Si solo tiene el tipo
T
, use la respuesta de @ nikeee.fuente