c# - usando - Obtención de argumentos de tipo de interfaces genéricas que implementa una clase
tipos de genericos (3)
Para limitarlo solo a un tipo específico de interfaz genérica, debe obtener la definición de tipo genérico y compararla con la interfaz "abierta" ( IGeneric<>
- no se especifica "T"):
List<Type> genTypes = new List<Type>();
foreach(Type intType in t.GetInterfaces()) {
if(intType.IsGenericType && intType.GetGenericTypeDefinition()
== typeof(IGeneric<>)) {
genTypes.Add(intType.GetGenericArguments()[0]);
}
}
// now look at genTypes
O como sintaxis de consulta LINQ:
Type[] typeArgs = (
from iType in typeof(MyClass).GetInterfaces()
where iType.IsGenericType
&& iType.GetGenericTypeDefinition() == typeof(IGeneric<>)
select iType.GetGenericArguments()[0]).ToArray();
Tengo una interfaz genérica, digamos IGeneric. Para un tipo dado, quiero encontrar los argumentos genéricos que una clase integra a través de IGeneric.
Es más claro en este ejemplo:
Class MyClass : IGeneric<Employee>, IGeneric<Company>, IDontWantThis<EvilType> { ... }
Type t = typeof(MyClass);
Type[] typeArgs = GetTypeArgsOfInterfacesOf(t);
// At this point, typeArgs must be equal to { typeof(Employee), typeof(Company) }
¿Cuál es la implementación de GetTypeArgsOfInterfacesOf (Tipo t)?
Nota: Se puede suponer que el método GetTypeArgsOfInterfacesOf está escrito específicamente para IGeneric.
Edición: Tenga en cuenta que estoy preguntando específicamente cómo filtrar la interfaz IGeneric de todas las interfaces que implementa MyClass.
Relacionados: averiguar si un tipo implementa una interfaz genérica
Type t = typeof(MyClass);
List<Type> Gtypes = new List<Type>();
foreach (Type it in t.GetInterfaces())
{
if ( it.IsGenericType && it.GetGenericTypeDefinition() == typeof(IGeneric<>))
Gtypes.AddRange(it.GetGenericArguments());
}
public class MyClass : IGeneric<Employee>, IGeneric<Company>, IDontWantThis<EvilType> { }
public interface IGeneric<T>{}
public interface IDontWantThis<T>{}
public class Employee{ }
public class Company{ }
public class EvilType{ }
typeof(MyClass)
.GetInterfaces()
.Where(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IGeneric<>))
.SelectMany(i => i.GetGenericArguments())
.ToArray();