【问题标题】:c# static constructor not called from derived classc# 派生类未调用静态构造函数
【发布时间】:2011-09-17 11:18:24
【问题描述】:
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 中的静态构造函数?

【问题讨论】:

  • 为什么是静态构造函数?静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。
  • 'field' 静态数据,只需要初始化一次,因此是静态构造函数。

标签: c# inheritance static-constructor


【解决方案1】:

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

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

【讨论】:

  • 不能直接调用静态构造函数。
  • 我意识到“错误”你可能意味着我的 OOP 已关闭。但是,我觉得能够继承静态成员(包括静态构造函数)实际上会更加面向对象。
  • @adt:只要引用任何静态字段或方法,它就会被隐式调用。
  • 可以直接调用静态构造器吗?
  • @adt:没有明确说明,但调用它可以完成,就像我提到的那样。
【解决方案2】:

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

调用Buss x = new Buss()会调用Bus&lt;Buss&gt;的静态构造函数。

调用Bus&lt;Buss&gt; x = new Bus&lt;Buss&gt;() 也会调用Bus&lt;Buss&gt; 的静态构造函数,但它会调用Buss 的类型参数,设置Buss.field

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

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

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

【讨论】:

    【解决方案3】:

    MSDN says '静态构造函数不被继承'。我猜这类似于不继承的静态字段。

    【讨论】:

    • “未继承的静态字段”:我的代码中有(归结)class T1{ public static string s1="s1"; } class T2: T1 { void f(){ Console.WriteLine(s1); }}。这不算继承吗?人们可以合理地期望基类的静态构造函数在其子类之一的静态构造函数执行之前执行,因为它也可能执行派生类所需的静态初始化。
    猜你喜欢
    • 2015-06-12
    • 2020-11-28
    • 2015-08-18
    • 2016-07-19
    • 1970-01-01
    • 2012-11-06
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多