Статический конструктор c # не вызывается из производного класса
-
29-10-2019 - |
Вопрос
Есть идеи, как сделать так, чтобы ссылка на статическое поле в Buss запускала статический конструктор в Bus?
Решение
Тот факт, что это важно для вас, вероятно, означает, что вы неправильно используете статические конструкторы.
Имея это в виду, вы можете создать статический конструктор в Buss
, который вручную вызывает статический конструктор в Bus
.Обратите внимание, что статический конструктор невозможно запустить более одного раза.
Другие советы
MSDN сообщает , что 'Статические конструкторы не наследуются ».Я думаю, это похоже на статические поля, которые тоже не наследуются.
Статический конструктор универсального типа вызывается ровно один раз для кода 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
является аргументом типа для самого себя.