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))