Статический конструктор c # не вызывается из производного класса - PullRequest
5 голосов
/ 17 июня 2011
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?

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

То, что это важно для вас, вероятно, означает, что вы используете статические конструкторы неправильно.

Имея это в виду, вы можете создать статический конструктор в Buss, который вручную вызывает статический конструктор в Bus. Обратите внимание, что невозможно запустить статический конструктор более одного раза.

2 голосов
/ 18 июня 2011

Статический конструктор универсального типа вызывается ровно один раз для 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 является аргументом типа для себя.

2 голосов
/ 18 июня 2011

MSDN говорит , что «Статические конструкторы не наследуются».Я думаю, что это похоже на статические поля, которые также не наследуются.

...