【问题标题】:Get the type of a closed type from the static constructor of the generic class that the closed type derives from从封闭类型派生自的泛型类的静态构造函数中获取封闭类型的类型
【发布时间】: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&lt;&gt;);
  • 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&lt;TypeImplementingIMyInterface&gt;,而不是MyClass。你可以像往常一样获取当前的封闭类型:typeof(MyGeneric&lt;T&gt;),但这当然不是 MyClass,因为这是完全不同的类型。
  • 确实如此,我认为它实际上回答了我的问题。谢谢。
  • 我希望得到反馈,说明为什么该问题被否决,以便下次做得更好。

标签: c# generics reflection static


【解决方案1】:

Evk 的评论是对该问题的间接回答:

是的,但封闭类型是 MyGeneric,而不是 MyClass。 您可以像往常一样获取当前的关闭类型:typeof(MyGeneric),但这会 当然不是 MyClass,因为这是完全不同的类型。

所以答案可以是: 假设 MyClass 与 MyGeneric 是同一个类是错误的,因此不可能从泛型类型获取 MyClass 的类型。

【讨论】:

  • 我会说这个问题本身没有什么意义,因为正如我在另一条评论中所说 - 您可能有 100 个类继承自您的 MyGeneric&lt;TypeImplementingIMyInterface&gt;,而不仅仅是 MyClass,因此尚不清楚哪个您想在构造函数中获取其中之一。您可以通过反射获得所有这些(通过搜索从 MyGeneric&lt;T&gt; 继承的所有类型),如下所示:Assembly.GetExecutingAssembly().GetTypes().Where(c =&gt; c.IsSubclassOf(typeof(MyGeneric&lt;T&gt;) in constructor。
  • 很遗憾,我无法编辑问题。我会将其重新表述为: 删除:是否可以通过反射从 MyGeneric 的静态构造函数中检索封闭类型 (MyClass) 的类型?如果是这样,怎么做?补充:是否有(更好的)替代方法可以让静态构造函数了解泛型类的派生类型的类型,而不是通过奇怪重复的模板模式使用所呈现的方法?
  • 好吧,我已经在上面的评论中展示了方法:Assembly.GetExecutingAssembly().GetTypes().Where(c =&gt; c.IsSubclassOf(typeof(MyGeneric&lt;T&gt;),从静态构造函数运行,将返回当前程序集中所有类型的列表,这些类型继承自 MyGeneric(所以,只有一个类型 - MyClass)。请注意,将 MyClass 命名为“封闭”类型是不正确的。 MyGeneric 已关闭。
  • 是的。您的评论包含一切。正如我试图解释的那样,我将“MyClass”视为封闭类型是错误的。
猜你喜欢
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多