2012-08-23 8 views
11

que tengo tres clases de la siguiente manera:¿Cómo obtener el parámetro de tipo genérico de la clase base?

public class TestEntity { } 

public class BaseClass<TEntity> { } 

public class DerivedClass : BaseClass<TestEntity> { } 

ya tengo la System.Type objeto de DerivedClass utilizando la reflexión en tiempo de ejecución. ¿Cómo puedo obtener el objeto System.Type de TestEntity usando la reflexión?

Gracias.

Respuesta

19

Supongo que su código es solo una muestra y no conoce explícitamente DerivedClass.

var type = GetSomeType(); 
var innerType = type.BaseType.GetGenericArguments()[0]; 

Tenga en cuenta que este código puede fallar muy fácilmente en tiempo de ejecución debe verificar si el tipo que maneja es lo que se espera que sea:

if(type.BaseType.IsGenericType 
    && type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>)) 

También puede haber más profunda árbol de herencia por lo que algunos de bucle con la condición anterior sería requerida.

+0

me sale objeto de tipo de DerivedClass de forma dinámica, por lo que no puede codificación dura. Me he resuelto. – lucn

+0

No he codificado 'DerivedClass' hay stub' var type = GetSomeType(); ' – Rafal

+0

Sí, esto es correcto. – lucn

0
var derivedType = typeof(DerivedClass); 
var baseClass = derivedType.BaseType; 
var genericType = baseClass.GetGenericArguments()[0]; 
0

Se piensa que esto debería funcionar:

var firstGenericArgumentType = typeof(DerivedClass).BaseType.GetGenericArguments().FirstOrDefault(); 

O

var someObject = new DerivedClass(); 
var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault(); 
2

Usted puede utilizar la propiedad BaseType. El siguiente código sería resistente a los cambios en la herencia (por ejemplo, si se agrega otra clase en el medio):

Type GetBaseType(Type type) 
{ 
    while (type.BaseType != null) 
    { 
     type = type.BaseType; 
     if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(BaseClass<>)) 
     { 
      return type.GetGenericArguments()[0]; 
     } 
    } 
    throw new InvalidOperationException("Base type was not found"); 
} 

// to use: 
GetBaseType(typeof(DerivedClass)) 
Cuestiones relacionadas