uso usando tipos tipo ser requiere referencia genericos generico genericas debe clases argumentos c# generics reflection

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();