Подтвердить что ты не робот

Явно вызов статического конструктора

Я хочу написать unit test для ниже класса.
Если имя отличается от "MyEntity", то mgr должен быть пустым.
Отрицательный Unit test
Использование диспетчера private accessor Я хочу изменить имя на "Test", чтобы mgr должен был быть нулевым. А затем проверит значение mgr. Для этого я хочу явно вызвать статический конструктор но когда я вызываю статический конструктор, используя

Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null); 

name всегда устанавливается в "MyEntity", как установить имя для "Test" и вызвать статический конструктор.

public class Manager
{        
        private static string name= "MyEntity";

        private static object mgr;

        static Manager()
        {
            try
            {
                mgr = CreateMgr(name);
            }
            catch (Exception ex)
            {
                mgr=null;
            }
        }
}
4b9b3361

Ответ 1

Как я узнал сегодня, статический конструктор CAN можно вызвать напрямую:

из fooobar.com/questions/157951/...

Другие ответы превосходны, но если вам нужно заставить класс конструктор для запуска без ссылки на тип (т.е. отражение), вы можете использовать:

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);  

Мне пришлось добавить этот код в мое приложение чтобы обойти возможную ошибку в .NET 4.0 CLR.

Ответ 2

Если у вас есть статический член в вашем классе (должен быть, иначе статический конструктор не будет делать слишком много), тогда нет необходимости явно вызывать статический конструктор.

Просто доступ к классу, где вы хотите вызвать его статический конструктор. Например:.

public void MainMethod()
{
    // Here you would like to call the static constructor

    // The first access to the class forces the static constructor to be called.
    object temp1 = MyStaticClass.AnyField;

    // or
    object temp2 = MyClass.AnyStaticField;
}

Ответ 3

Для тех, кто найдет эту тему и задается вопросом... Я просто сделал тест. Похоже, что System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor() будет запускать только статический конструктор, если он уже выполнил not по другой причине.

Например, если ваш код не является положительным, если предыдущий код мог получить доступ к классу и запускал статический конструктор для запуска, это не имеет значения. Этот предыдущий доступ вызовет запуск статического конструктора, но тогда RunClassConstructor() также не будет запускать его. RunClassConstructor() запускает только статический конструктор, если он еще не запущен.

Доступ к классу после того, как RunClassConstructor() также выполняет не, приводит к тому, что статический конструктор запускается второй раз.

Это основано на тестировании в приложении UWP Win10.

Ответ 4

Поместите код, который вы хотите вызвать в конструкторе, в открытый метод и вызовите его из конструктора