c# - 强制构建静态对象

标签 c# .net

据我所知,类中的静态对象是在类第一次被引用时构造的。但是我发现有时在程序启动时初始化静态变量很有用。是否有某种方法(即通过使用注释)来强制执行它?

最佳答案

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

例如:

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

请注意,这不会调用泛型类型的类型初始值设定项,因为您需要指定类型参数。您还应该注意,它会强制运行类型初始值设定项即使它已经运行,这与正常体验背道而驰。我建议,如果您真的需要这样做(并且我会尝试更改您的设计,以便您尽可能不需要它),您应该创建自己的属性,并将代码更改为像这样的东西:

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);
    }
}

诚然,您可以使用 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);
}

关于c# - 强制构建静态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1979008/

相关文章:

c++ - 检查文件是否稀疏

c# - 发布时在 clickonce 应用程序中签署可执行文件

c# - 如何使用 SQLite.Net-PCL 制作 SQLite 外键

c# - 使用 Visual Studio 测试运行程序运行的 xUnit 测试的输出未显示在“输出”窗口中

c# - 父控件鼠标进入/离开事件与子控件

c# - 如何使用 Outlook 后期绑定(bind)将附件添加到 mailitem

c# - .NET 中的错误?

c# - 如何将 Entity Framework 4.5 设置为从不将任何属性设置为 Nullable

c# - CreateCompatibleDC(IntPtr.Zero) 返回 IntPtr.Zero

c# - 跨平台方式获取父进程ID