C# 如何获得基类';s泛型类型参数?
我有以下三个班:C# 如何获得基类';s泛型类型参数?,c#,generics,reflection,C#,Generics,Reflection,我有以下三个班: public class TestEntity { } public class BaseClass<TEntity> { } public class DerivedClass : BaseClass<TestEntity> { } 公共类测试实体{} 公共类基类{} 公共类DerivedClass:基类{} 我已经在运行时使用反射获得了DerivedClass的System.Type对象。如何使用反射获取TestEntity的System.T
public class TestEntity { }
public class BaseClass<TEntity> { }
public class DerivedClass : BaseClass<TestEntity> { }
公共类测试实体{}
公共类基类{}
公共类DerivedClass:基类{}
我已经在运行时使用反射获得了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<>))
if(type.BaseType.IsGenericType
&&type.BaseType.GetGenericTypeDefinition()==typeof(BaseClass))
此外,还可以有更深层次的继承树,因此需要一些具有上述条件的循环。它认为这应该可行:
var derivedType = typeof(DerivedClass);
var baseClass = derivedType.BaseType;
var genericType = baseClass.GetGenericArguments()[0];
var firstGenericArgumentType = typeof(DerivedClass).BaseType.GetGenericArguments().FirstOrDefault();
或
您可以使用BaseType属性。以下代码对于继承中的更改具有弹性(例如,如果在中间添加另一个类):
类型GetBaseType(类型)
{
while(type.BaseType!=null)
{
type=type.BaseType;
if(type.IsGenericType&&type.GetGenericTypeDefinition()==typeof(基类))
{
返回类型。GetGenericArguments()[0];
}
}
抛出新的InvalidOperationException(“未找到基类型”);
}
//使用:
GetBaseType(typeof(DerivedClass))
我动态获取DerivedClass的类型对象,因此无法硬编码。我已经解决了。我没有硬编码DerivedClass
有存根var type=GetSomeType()代码>
var someObject = new DerivedClass();
var firstGenericArgumentType = someObject.GetType().BaseType.GetGenericArguments().FirstOrDefault();
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))