显式调用静态构造函数

mee*_*eep 32 c# mstest static-constructor system.reflection

我想为下面的课程编写单元测试.
如果名称不是"MyEntity",则mgr应为空白.
负单元测试
使用Manager私有访问器我想将名称更改为"Test",以便mgr应为null.然后将验证mgr值.为了实现这一点,我想显式调用静态构造函数,但是当我使用静态构造函数调用时

Manager_Accessor.name = "Test"
typeof(Manager).TypeInitializer.Invoke(null, null); 
Run Code Online (Sandbox Code Playgroud)

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;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

Tob*_*uss 40

正如我今天发现的那样,可以直接调用静态构造函数:

来自另一个Stackoverflow帖子

其他答案非常好,但是如果你需要强制一个类构造函数在没有引用类型(即反射)的情况下运行,你可以使用:

Type type = ...;
System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(type.TypeHandle);  
Run Code Online (Sandbox Code Playgroud)

我不得不将此代码添加到我的应用程序中以解决.net 4.0 CLR中可能存在的错误.


小智 8

对于任何发现这个线程并想知道的人......我刚刚做了测试。看来System.Runtime.CompilerServices.RuntimeHelpers.RunClassConstructor(),如果它只能运行静态构造函数不是已经运行的另一个原因。

例如,如果您的代码不确定以前的代码是否可能访问了该类并触发了静态构造函数运行,则这无关紧要。先前的访问将触发静态构造函数运行,但 RunClassConstructor() 也不会运行它。RunClassConstructor() 仅在尚未运行的情况下运行静态构造函数。

访问RunClassConstructor后级()也并不会导致静态构造函数中运行第二次。

这是基于在 Win10 UWP 应用中进行的测试。