强制构造静态物体

kyk*_*yku 2 .net c#

正如我所知,类中的静态对象是在第一次引用类时构造的.但是我发现在程序启动时初始化静态有时很有用.是否有一些方法(即通过使用注释)来执行它?

Jon*_*eet 7

你不能用属性(没有额外的代码)来做,但你可以用反射强制类型初始化.

例如:

foreach (Type type in assembly.GetTypes())
{
    ConstructorInfo ci = type.TypeInitializer;
    if (ci != null)
    {
         ci.Invoke(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这不会为泛型类型调用类型初始值设定项,因为您需要指定类型参数.您还应该注意,它将强制运行类型初始化程序,即使它已经运行过,面对正常体验也是如此.我建议如果你真的需要这样做(我会尝试改变你的设计,如果可能你不需要它)你应该创建自己的属性,并将代码改为:

foreach (Type type in assembly.GetTypes())
{
    if (type.GetCustomAttributes(typeof(..., false)).Length == 0)
    {
        continue;
    }
    ConstructorInfo ci = type.TypeInitializer;
    if (ci != null)
    {
         ci.Invoke(null, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以用LINQ做到这一点,诚然:

var initializers = from type in assembly.GetTypes()
                   let initializer = type.TypeInitializer
                   where initializer != null &&
                         type.GetCustomAttributes(typeof(..., false).Length > 0
                   select initializer;
foreach (ConstructorInfo initializer in initializers)
{
    initializer.Invoke(null, null);
}
Run Code Online (Sandbox Code Playgroud)

  • @kyku:如果这是你的意图,你正在为最终的维护/测试噩梦做好准备.这是远距离的怪异行动,应该不惜一切代价避免. (3认同)
  • @kyku:不,不是没有类似上面的代码. (2认同)

Meh*_*ari 5

只需在应用程序开头引用该类型的静态字段即可.没有办法单独通过改变类定义站点上的代码来实现这一点.