25

我有以下三个课程:

public class TestEntity { }

public class BaseClass<TEntity> { }

public class DerivedClass : BaseClass<TestEntity> { }

我已经得到了在运行时使用反射的System.Type对象。DerivedClass如何获得使用反射的System.Type对象?TestEntity

谢谢。

4

4 回答 4

38

我假设您的代码只是一个示例,您并不明确知道DerivedClass.

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

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

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

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

于 2012-08-23T08:36:10.753 回答
5

您可以使用 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))
于 2012-08-23T08:44:58.050 回答
0
var derivedType = typeof(DerivedClass);
var baseClass = derivedType.BaseType;
var genericType = baseClass.GetGenericArguments()[0];
于 2012-08-23T08:36:48.853 回答
0

它认为这应该有效:

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

或者

var someObject = new DerivedClass();
var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault();
于 2012-08-23T08:36:52.277 回答