Я не уверен, почему это работает, но, насколько я понимаю (с помощью Skeet), если у меня есть статический класс
public static class Statics1
{
public static string Value1 { get; set; }
static Statics1()
{
Console.WriteLine("Statics1 cctor");
Value1 = "Initialized 1";
}
}
Код:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null);
or
staticType.TypeInitializer.Invoke(new object[0]);
вызовет исключение, потому что каким-то образом это разрешается в .ctor вместо .cctor класса.
Если я использую явно статический класс, он обрабатывается как абстрактный запечатанный класс, поэтому исключение состоит в том, что абстрактный класс не может быть создан, и если я использую обычный класс со статическим конструктором, исключение состоит в том, что инициализатор типа не вызывается.
Но если я использую перегрузку Invoke с двумя параметрами (instance, params), вот так:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);
явно заявляя, что я вызываю статический метод (в этом смысл первого нуля - нет экземпляра == static), это работает и инициализирует класс.
Тем не менее, статические конструкторы — странные звери. Вызов одного из них таким образом вызовет статический конструктор, даже если он уже был выполнен, т. е. этот код:
Console.WriteLine(Statics1.Value1);
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);
вызовет статический конструктор дважды. Поэтому, если ваши cctors имеют потенциально важные побочные эффекты, такие как создание файлов, открытие баз данных и т. д., вы можете пересмотреть этот подход.
Кроме того, хотя я предпочитаю статические конструкторы из соображений удобочитаемости, с точки зрения производительности инициализаторы полей немного быстрее, чем статические конструкторы
person
SWeko
schedule
20.12.2010
fooType.TypeInitializer.Invoke(null, null);
, как указано в этом ответе? - person Ani   schedule 20.12.2010