我有以下三个课程:
public class TestEntity { }
public class BaseClass<TEntity> { }
public class DerivedClass : BaseClass<TestEntity> { }
我已经在运行时使用反射获得System.Type
DerivedClass
对象System.Type
。如何使用反射获取TestEntity
的{{1}}对象?
感谢。
答案 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();