如何获取基类的generics类型参数?
我有三节课如下:
public class TestEntity { } public class BaseClass { } public class DerivedClass : BaseClass { }
我已经在运行时使用reflection获取了DerivedClass
的System.Type
对象。 如何使用reflection获取TestEntity
的System.Type
对象?
谢谢。
我假设您的代码只是一个示例,并且您没有明确地知道DerivedClass
。
var type = GetSomeType(); var innerType = type.BaseType.GetGenericArguments()[0];
请注意,此代码在运行时很容易失败,您应该validation您处理的类型是否符合您的预期:
if(type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(BaseClass<>))
也可以有更深的inheritance树,因此需要一些具有上述条件的循环。
您可以使用BaseType属性。 以下代码对于inheritance的更改是有弹性的(例如,如果在中间添加另一个类):
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();