C# 从封闭类型派生自的泛型类的静态构造函数中获取封闭类型的类型

C# 从封闭类型派生自的泛型类的静态构造函数中获取封闭类型的类型,c#,generics,reflection,static,C#,Generics,Reflection,Static,如果我有一个带有静态构造函数和约束的泛型类型 interface IMyInterface { ... } class MyGeneric<T> where T : IMyInterface { static MyGeneric() { .... } } 我想知道在所描述的场景中是否还有其他方法可用。 如果答案是否定的,我接受否定。的评论是对问题的间接回答: 是的,但是封闭类型是MyGeneric,而不是MyClass。 您可以像往常一样获取当前关

如果我有一个带有静态构造函数和约束的泛型类型

interface IMyInterface
{
...
}

class MyGeneric<T> where T : IMyInterface
{
    static MyGeneric()
    {
    ....
    }
}
我想知道在所描述的场景中是否还有其他方法可用。

如果答案是否定的,我接受否定。

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

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

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

假设您有2个从MyGeneric继承的“封闭”类型,在您的情况下应该选择哪种类型?根据每个封闭类型,都会获得自己的静态初始化和静态变量的副本。因此,我想知道System.Reflection中是否存在允许检索静态构造函数被调用的类型的mecanism。我有点像是通过静态构造函数中的反射检索到的“this”。是的,但是封闭类型是
MyGeneric
,而不是
MyClass
。你可以像往常一样得到当前的封闭类型:
typeof(MyGeneric)
,但这当然不是MyClass,因为这是一个完全不同的类型。这是真的,我想它实际上回答了我的问题。谢谢你。我希望得到关于为什么这个问题被否决的反馈,以便下次能做得更好。我认为这个问题本身没有什么意义,因为正如我在另一篇评论中所说的,你可能有100个类继承自你的
MyGeneric
,而不仅仅是MyClass,因此,我们不太清楚在构造函数中应该使用哪一个。但是,您可以通过反射(通过搜索从
MyGeneric
继承的所有类型)来获取所有类型,例如:
Assembly.getExecutionGassembly().GetTypes().Where(c=>c.IsSubclassOf(typeof(MyGeneric))
在构造函数中。不幸的是,我无法编辑该问题。我将其重新表述为:Remove:是否可以通过反射从MyGeneric中的静态构造函数中检索封闭类型(MyClass)的类型?如果可以,如何进行?添加:是否有(更好)与通过奇怪的循环模板模式使用所提出的方法相比,让静态构造函数知道泛型类的派生类型的替代方法?我在上面的注释中已经说明了方法:
Assembly.getExecutionGassembly().GetTypes().Where(c=>c.IsSubclassOf(typeof)(MyGeneric)
,从静态构造函数运行,将返回当前程序集中从MyGeneric继承的所有类型的列表(因此,只有一个类型-MyClass)。请注意,将MyClass命名为“closed”类型是不正确的。MyGeneric已关闭。是的。您的注释包含所有内容。正如我试图解释的,我错误地将“MyClass”视为关闭类型。
class MyClass : MyGeneric<TypeImplementingIMyInterface>
{
    ...
}
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>
{
    // ...
}