6
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 中的静态字段的引用触发 Bus 中的静态构造函数?

4

3 回答 3

3

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

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

于 2011-06-17T19:45:28.027 回答
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

您提供的示例仅适用,因为Buss它本身就是类型参数。

于 2011-06-17T20:09:32.307 回答
1

MSDN 说“不继承静态构造函数”。我猜这类似于不继承的静态字段。

于 2011-06-17T20:05:46.583 回答