繁体   English   中英

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

[英]How to get base class's generic type parameter?

我有三个课程如下:

public class TestEntity { }

public class BaseClass<TEntity> { }

public class DerivedClass : BaseClass<TestEntity> { }

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

谢谢。

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

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

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

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

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

您可以使用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))
var derivedType = typeof(DerivedClass);
var baseClass = derivedType.BaseType;
var genericType = baseClass.GetGenericArguments()[0];

它认为这应该工作:

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

要么

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM