【发布时间】:2017-04-28 16:18:25
【问题描述】:
如果我有一个带有静态构造函数和约束的泛型类型
interface IMyInterface
{
...
}
class MyGeneric<T> where T : IMyInterface
{
static MyGeneric()
{
....
}
}
还有一个封闭的类型:
class MyClass : MyGeneric<TypeImplementingIMyInterface>
{
...
}
是否有可能,通过反射,从 MyGeneric 的静态构造函数中检索封闭类型 (MyClass) 的类型?如果是这样,如何?
到目前为止我已经尝试过但没有成功:
var t = typeof(MyGeneric<>);-
var t = MethodBase.GetCurrentMethod().GetType();
我知道我可以使用Curiously Recurring Template Pattern 做我想做的事:
interface IMyInterface
{
}
class MyBase
{
}
class MyGeneric<T1, T2> : MyBase where T1 : IMyInterface, T2 : MyBase
{
static MyGeneric()
{
var t = typeof(T2);
// ...
}
}
class MyClass : MyGeneric<TypeImplementingIMyInterface, MyClass>
{
// ...
}
我想知道在所描述的场景中是否可以使用另一种方法。
如果这是答案,我接受“否”作为答案。
【问题讨论】:
-
假设您有 2 个从 MyGeneric 继承的“封闭”类型,您应该选择哪种类型?
-
根据this,每个封闭类型都有自己的静态初始化和静态变量的副本。因此,我想知道 System.Reflection 中是否存在任何机制,允许检索为其调用静态构造函数的类型。我通过静态构造函数的反射检索到“this”。
-
是的,但是封闭类型是
MyGeneric<TypeImplementingIMyInterface>,而不是MyClass。你可以像往常一样获取当前的封闭类型:typeof(MyGeneric<T>),但这当然不是 MyClass,因为这是完全不同的类型。 -
确实如此,我认为它实际上回答了我的问题。谢谢。
-
我希望得到反馈,说明为什么该问题被否决,以便下次做得更好。
标签: c# generics reflection static