[英]How to get base class's generic type parameter?
我有三个课程如下:
public class TestEntity { }
public class BaseClass<TEntity> { }
public class DerivedClass : BaseClass<TestEntity> { }
我已经在运行时使用反射获取了DerivedClass
的System.Type
对象。 如何使用反射获取TestEntity
的System.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.