我有三个类为:如何获取基类的泛型类型参数?
public class TestEntity { }
public class BaseClass<TEntity> { }
public class DerivedClass : BaseClass<TestEntity> { }
我在运行时使用反射已经得到DerivedClass
的System.Type
对象。我如何使用反射获得TestEntity
的System.Type
对象?
谢谢。
我有三个类为:如何获取基类的泛型类型参数?
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<>))
也可以有更深的继承树这样一些环以上条件将是必需的。
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();
您可以使用基本类型属性。 (如果你在中间添加其他类如)下面的代码将弹性在继承的变化:
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))
我得到DerivedClass的对象类型动态,所以不能硬编码。我已解决。 – lucn
我没有硬编码DerivedClass存在存根'var type = GetSomeType();' – Rafal
是的,这是正确的。 – lucn