2012-08-23 129 views
11

我有三个类为:如何获取基类的泛型类型参数?

public class TestEntity { } 

public class BaseClass<TEntity> { } 

public class DerivedClass : BaseClass<TestEntity> { } 

我在运行时使用反射已经得到DerivedClassSystem.Type对象。我如何使用反射获得TestEntitySystem.Type对象?

谢谢。

回答

19

我假定你的代码只是一个样本,你没有明确知道DerivedClass

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

注意,这个代码可以很容易的在运行时,如果类型你处理,你应该验证失败是你希望它是什么:

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

也可以有更深的继承树这样一些环以上条件将是必需的。

+0

我得到DerivedClass的对象类型动态,所以不能硬编码。我已解决。 – lucn

+0

我没有硬编码DerivedClass存在存根'var type = GetSomeType();' – Rafal

+0

是的,这是正确的。 – lucn

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

它认为这应该工作:

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

或者

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

您可以使用基本类型属性。 (如果你在中间添加其他类如)下面的代码将弹性在继承的变化:

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