我有以下三个课程:
public class TestEntity { }
public class BaseClass<TEntity> { }
public class DerivedClass : BaseClass<TestEntity> { }
我已经得到了在运行时使用反射的System.Type
对象。DerivedClass
如何获得使用反射的System.Type
对象?TestEntity
谢谢。
我有以下三个课程:
public class TestEntity { }
public class BaseClass<TEntity> { }
public class DerivedClass : BaseClass<TestEntity> { }
我已经得到了在运行时使用反射的System.Type
对象。DerivedClass
如何获得使用反射的System.Type
对象?TestEntity
谢谢。
我假设您的代码只是一个示例,您并不明确知道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();