c#静态构造函数未从派生类调用

时间:2011-06-17 19:42:52

标签: c# inheritance static-constructor

class Bus<T>
{
    static Bus()
    {
        foreach(FieldInfo fi in typeof(T).GetFields())
        {
            if(fi.FieldType == typeof(Argument))
            {
                fi.SetValue(typeof(T), new Argument("busyname", "busyvalue"));
            }
        }
    }
}
class Buss : Bus<Buss>
{
    public static Argument field;
}

任何想法如何使这个工作,以便Buss中的静态字段的引用触发总线中的静态构造函数?

3 个答案:

答案 0 :(得分:3)

这对你很重要的事实可能意味着你使用的是静态构造函数错误。

考虑到这一点,您可以在Buss中创建一个静态构造函数,手动调用Bus中的静态构造函数。请注意,不可能多次运行静态构造函数。

答案 1 :(得分:2)

MSDN says'静态构造函数不是继承的'。我想这类似于静态字段,它们也没有被继承。

答案 2 :(得分:2)

当引用该类型时,每Type调用一次泛型类型的静态构造函数。

调用Buss x = new Buss()将调用Bus<Buss>的静态构造函数。

调用Bus<Buss> x = new Bus<Buss>()也将调用Bus<Buss>的静态构造函数,但它会对其类型参数Buss执行此操作,并设置Buss.field

如果你创建一个class Bugs : Bus<Buss>,它将永远不会设置Bugs.field,因为它将首先解析类型参数Buss,它会调用它的基类Bus<Buss>的静态构造函数,设置Buss.field。当它试图调用Bugs基类的静态构造函数时,它会认为它已经调用了静态Bus<Buss>构造函数并跳过它。

基本上,如果我复制粘贴代码,创建一个虚拟Argument类并创建Buss的新实例,则会调用静态构造函数 Buss.field 设置为Argument的实例,但我确实认识到这里有一些奇怪的行为,我必须建议不要使用静态方法的反射来达到子类的静态。< / p>

您提供的示例仅起作用,因为Buss是其自身的类型参数。

相关问题