我有:
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)
我如何得到类型T1和T2如果我有实例MyConcrete1或MyConcrete2或MyConcreteBase或任何其他类型的实例派生自MyBase<T1, T2>
我现在这样做的方式是使用.GetType().BaseTypewhile BaseType.Name.StartsWith("MyBase")然后使用继承链"起床".GetGenericArguments()
它工作正常,但我对它不满意,尤其是.StartsWith("MyBase")部分.
有人有其他建议吗?
是的,不要使用字符串解析。你可以简单地使用BaseType.IsAssignableFrom(typeof(MyBase<,>))(可能必须颠倒BaseType和MyBase<,>——我总是感到困惑)。
将类型公开为基类中的属性也可能更容易,例如:
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