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中的静态字段的引用触发总线中的静态构造函数?
答案 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
是其自身的类型参数。