c#静态构造函数未从派生类调用
class Bus { 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 { public static Argument field; }
任何想法如何使这个工作,以便在Buss中引用静态字段的引用触发总线中的静态构造函数?
这对你很重要的事实可能意味着你使用静态构造函数是错误的。
考虑到这一点,您可以在Buss
中创建一个静态构造函数,手动调用Bus
的静态构造函数。 请注意,不可能多次运行静态构造函数。
MSDN说 “静态构造函数不是inheritance的”。 我想这类似于静态字段,它们也没有被inheritance。
当引用该类型时,每个Type
只调用一次Type
的静态构造函数。
调用Buss x = new Buss()
将调用Bus
的静态构造函数。
调用Bus
也将调用Bus
的静态构造函数,但它将为其类型参数Buss
,设置Buss.field
。
如果你创建一个class Bugs : Bus
它将永远不会设置Bugs.field
,因为它将首先解析类型参数Buss
,它调用它的基类Bus
的静态构造函数,设置Buss.field
。 当它试图调用Bugs
基类的静态构造函数时,它会认为它已经调用了静态Bus
构造函数并跳过它。
基本上如果我复制粘贴你的代码,创建一个虚拟的Argument
类并创建一个新的Buss
实例,调用静态构造函数并将Buss.field
设置为Argument
一个实例,但我确实认识到了一些奇怪的行为,我在这里d必须建议不要使用静态方法的reflection来达到子类的静态。
您提供的示例仅起作用,因为Buss
是其自身的类型参数。