você deve atualizar sua resposta com um exemplo, por exemplo, typeof (T) .IsAssignableFrom (typeof (IMyInterface))
Dr. Andrew Burnett-Thompson
Não feito nikeee; a velha resposta ainda está lá. :) Demorei alguns segundos para descobrir o que estava errado. De qualquer forma, +1, bom recurso novamente do framework .net.
Samuel
Na verdade, o jeito que você mencionou é o mesmo que eu fazia há algum tempo. Eu corrigi este. Veja os comentários anteriores. T inherits Urealmente se traduz em typeof(T).IsAssignableFrom(typeof(U)).
nikeee
2
Embora isso quase funcione, há um problema em que se Tfor restrito a algum outro tipo TOther, então quando executado, typeof(T)irá realmente avaliar typeof(TOther)e não qualquer tipo que Tvocê realmente passou e, nesse caso, typeof(SomeInterface).IsAssignableFrom(typeof(T))irá falhar (assumindo TOtherque também não implementa SomeInterface), mesmo que seu tipo de concreto tenha implementado SomeInterface.
Dave Cousineau
1
No núcleo .net IsAssignableFromda TypeInfoclasse só aceita TypeInfo como seu único argumento, então o exemplo deve ser o seguinte:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Se você quiser verificar durante a compilação: Erro se se TNÃO implementar a interface / classe desejada, você pode usar a seguinte restrição
publicvoidMyRestrictedMethod<T>()where T :MyInterface1,MyInterface2,MySuperClass{//Code of my method here, clean without any check for type constraints.}
Valor de retorno:true se ce o atual Typerepresentam o mesmo tipo, ou se o atual Typeestá na hierarquia de herança de c, ou se o atual Typeé um interfaceque cimplementa, ou se cé um parâmetro de tipo genérico e o atual Typerepresenta uma das restrições de c, ou if crepresenta um tipo de valor e o atual Typerepresenta Nullable<c>( Nullable(Of c)no Visual Basic). falsese nenhuma dessas condições for true, ou se cfor null.
Se Employee IsAssignableFrom Tentão Therda de Employee.
O uso
typeof(T).IsAssignableFrom(typeof(Employee))
truesó retorna quando
Te Employeerepresentam o mesmo tipo; ou,
Employeeherda de T.
Este pode ser o uso pretendido em alguns casos, mas para a pergunta original (e o uso mais comum), para determinar quando Therda ou implementa algum class/ interface, use:
porque você pode literalmente atribuir de uma instância de a DerivedTypea uma instância de a BaseType:
DerivedType childInstance =newDerivedType();BaseType parentInstance = childInstance;// okay, assigning base from derived
childInstance =(DerivedType) parentInstance;// not okay, assigning derived from base
Embora IsAssignableFrom seja a melhor maneira como outros declararam, se você só precisar verificar se uma classe herda de outra, typeof(T).BaseType == typeof(SomeClass)isso também funcionará.
Isso funciona, a menos que SomeClassnão seja diretamente derivado de BaseClass.
Suncat2000,
0
Maneiras alternativas de saber se um objeto oherda uma classe ou implementa uma interface é usar os operadores ise as.
Se você quiser saber apenas se um objeto herda uma classe ou implementa uma interface, o isoperador retornará um resultado booleano:
bool isCompatibleType =(o isBaseType|| o isIInterface);
Se você quiser usar a classe herdada ou a interface implementada após o teste, o asoperador executará uma conversão segura, retornando uma referência à classe herdada ou à interface implementada se compatível ou nula se não for compatível:
BaseType b = o asBaseType;// Null if d does not inherit from BaseType.IInterface i = o asIInterface;// Null if d does not implement IInterface.
Se você tiver apenas o tipo T, use a resposta de @nikeee.
Respostas:
Existe um método chamado Type.IsAssignableFrom () .
Para verificar se
T
herda / implementaEmployee
:Se você está direcionando o .NET Core, o método mudou para TypeInfo:
fonte
T inherits U
realmente se traduz emtypeof(T).IsAssignableFrom(typeof(U))
.T
for restrito a algum outro tipoTOther
, então quando executado,typeof(T)
irá realmente avaliartypeof(TOther)
e não qualquer tipo queT
você realmente passou e, nesse caso,typeof(SomeInterface).IsAssignableFrom(typeof(T))
irá falhar (assumindoTOther
que também não implementaSomeInterface
), mesmo que seu tipo de concreto tenha implementadoSomeInterface
.IsAssignableFrom
daTypeInfo
classe só aceita TypeInfo como seu único argumento, então o exemplo deve ser o seguinte:typeof(Employee).GetTypeInfo().IsAssignableFrom(typeof(T).GetTypeInfo())
Você pode usar restrições na classe.
Dê uma olhada em http://msdn.microsoft.com/en-us/library/d5x73970.aspx
fonte
Se você quiser verificar durante a compilação: Erro se se
T
NÃO implementar a interface / classe desejada, você pode usar a seguinte restriçãoEspero que ajude.
fonte
A sintaxe correta é
Documentação
fonte
Explicação
Se
Employee IsAssignableFrom T
entãoT
herda deEmployee
.O uso
true
só retorna quandoT
eEmployee
representam o mesmo tipo; ou,Employee
herda deT
.Este pode ser o uso pretendido em alguns casos, mas para a pergunta original (e o uso mais comum), para determinar quando
T
herda ou implementa algumclass
/interface
, use:fonte
O que todos realmente querem dizer é:
porque você pode literalmente atribuir de uma instância de a
DerivedType
a uma instância de aBaseType
:quando
E alguns exemplos concretos se você estiver tendo problemas para entender:
(via LinqPad, daí o
HorizontalRun
eDump
)Resultados
e
fonte
Eu acredito que a sintaxe é:
typeof(Employee).IsAssignableFrom(typeof(T));
fonte
Embora IsAssignableFrom seja a melhor maneira como outros declararam, se você só precisar verificar se uma classe herda de outra,
typeof(T).BaseType == typeof(SomeClass)
isso também funcionará.fonte
SomeClass
não seja diretamente derivado deBaseClass
.Maneiras alternativas de saber se um objeto
o
herda uma classe ou implementa uma interface é usar os operadoresis
eas
.Se você quiser saber apenas se um objeto herda uma classe ou implementa uma interface, o
is
operador retornará um resultado booleano:Se você quiser usar a classe herdada ou a interface implementada após o teste, o
as
operador executará uma conversão segura, retornando uma referência à classe herdada ou à interface implementada se compatível ou nula se não for compatível:Se você tiver apenas o tipo
T
, use a resposta de @nikeee.fonte