如何在c#中从派生类型中获取泛型类型的泛型参数类型

And*_*vko 5 c# reflection

我有:

class MyBase<T1, T2>{}

class MyConcreteBase<T2> : MyBase<ConcreteType1, T2>{}

class MyConcrete1 : MyConcreteBase<ConcreteType2>{}

class MyConcrete2 : MyBase<ConcreteType1, ConcreteType2>{}
Run Code Online (Sandbox Code Playgroud)

我如何得到类型T1T2如果我有实例MyConcrete1MyConcrete2MyConcreteBase或任何其他类型的实例派生自MyBase<T1, T2>

我现在这样做的方式是使用.GetType().BaseTypewhile BaseType.Name.StartsWith("MyBase")然后使用继承链"起床".GetGenericArguments()

它工作正常,但我对它不满意,尤其是.StartsWith("MyBase")部分.

有人有其他建议吗?

sir*_*ide 2

是的,不要使用字符串解析。你可以简单地使用BaseType.IsAssignableFrom(typeof(MyBase<,>))(可能必须颠倒BaseTypeMyBase<,>——我总是感到困惑)。

将类型公开为基类中的属性也可能更容易,例如:

public Type T1_Type { get { return typeof(T1); } }
public Type T2_Type { get { return typeof(T2); } }
Run Code Online (Sandbox Code Playgroud)

我确实想问,为什么需要提取这些类型参数?这对我来说是一种代码味道。

编辑:我应该补充一点,您不能IsAssignableFrom按原样使用泛型。查看此答案以获得完整的解决方案:How To Detect If Type is Another Generic Type