如何获取基类的泛型类型参数?

时间:2012-08-23 08:26:01

标签: c# generics reflection

我有以下三个课程:

public class TestEntity { }

public class BaseClass<TEntity> { }

public class DerivedClass : BaseClass<TestEntity> { }

我已经在运行时使用反射获得System.Type DerivedClass对象System.Type。如何使用反射获取TestEntity的{​​{1}}对象?

感谢。

4 个答案:

答案 0 :(得分:28)

我认为您的代码只是一个示例,并且您没有明确地知道DerivedClass

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

请注意,此代码在运行时很容易失败,您应该验证您处理的类型是否符合您的预期:

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

也可以有更深的继承树,因此需要一些具有上述条件的循环。

答案 1 :(得分:2)

您可以使用BaseType属性。以下代码对于继承的更改具有弹性(例如,如果您在中间添加另一个类):

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

它认为这应该有效:

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

或者

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