控制何时调用静态构造函数

2024-02-28

在我的自定义属性的静态构造函数中,我在加载的程序集中搜索用我的属性修饰的所有类,并对它们执行一些操作。

我希望在运行时尽快调用静态构造函数,最好是在执行之前static void Main()入口点。

目前,只有在我对属性进行一些调用后才会调用它。我could在我的程序中的其他地方进行这样的调用,但理想情况下该属性的功能应该是独立的。

为了寻找答案,我阅读了这篇文章MSDN http://msdn.microsoft.com/en-us/library/k9x6w0hc%28VS.80%29.aspx:

用户无法控制静态构造函数何时在程序中执行。

但肯定有一些棘手、狡猾或恶作剧的解决方法可以让静态构造函数尽快被调用。也许可以使用属性、反射或其他类型的魔法。能做到吗?

因为人们无疑会告诉我,没有充分的理由去做我所要求的事情,所以我提出了我的目的和我的代码:我正在尝试使用属性来声明性地配置db4o http://en.wikipedia.org/wiki/Db4o工厂。如果我的属性的静态构造函数在我已经建立连接之后被调用,那么它没有任何效果并且没有用处。因此,必须在我的程序有机会建立这样的连接之前调用它。

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)]
sealed public class CascadeOnUpdateAttribute : Attribute
{
    public bool Flag { get; private set; }

    public CascadeOnUpdateAttribute() : this(true) { }

    public CascadeOnUpdateAttribute(bool flag)
    {
        Flag = flag;
    }

    static CascadeOnUpdateAttribute()
    {
        var targets = from assembly in AppDomain.CurrentDomain.GetAssemblies()
          from type in assembly.GetTypes()
          from attribute in type.GetCustomAttributes(typeof(CascadeOnUpdateAttribute), false).Cast<CascadeOnUpdateAttribute>()
          select new { Type = type, Cascade = attribute.Flag };

        foreach (var target in targets)
        {
            Db4oFactory.Configure().ObjectClass(target.Type).CascadeOnUpdate(target.Cascade);
        }
    }
}

Update:

我最终使用了带有静态方法的抽象属性。通过这种方式,我可以派生任意数量的属性,并且通过调用此方法将它们全部应用于指定的配置。

public abstract class Db4oAttribute : Attribute
{
    public abstract void Configure(IConfiguration config, Type type);

    public static void ApplyAttributes(IConfiguration config)
    {
        var targets = from assembly in AppDomain.CurrentDomain.GetAssemblies()
          from type in assembly.GetTypes()
          from attribute in type.GetCustomAttributes(typeof(Db4oAttribute), false).Cast<Db4oAttribute>()
          select new { Type = type, Attribute = attribute };

        foreach (var target in targets)
        {
            target.Attribute.Configure(config, target.Type);
        }
    }
}

以及调用站点:

Db4oAttribute.ApplyAttributes(Db4oFactory.Configure());
_db = Db4oFactory.OpenFile("Test.db4o");

正如马克所说,我会明确地这样做Main如果我是你。

You can使用显式调用类型初始值设定项Type.TypeInitializer http://msdn.microsoft.com/en-us/library/system.type.typeinitializer.aspx属性并调用它。但是,这将导致它再次运行即使它已经运行过这可能会产生意想不到的结果。

我个人会将该代码完全移出静态初始化程序。它是配置代码 - 为什么不将其设为可以显式调用的静态方法?我什至不确定是否将其包含在属性类本身中,但至少显式调用:

CascadeOnUpdateAttribute.ConfigureDb4oFactories();

比调用虚拟方法或以其他方式强制类型初始化更清晰,只是为了获得副作用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

控制何时调用静态构造函数 的相关文章

  • 分段错误(核心转储)错误

    我的程序编译罚款 但在输入文件时出现 分段错误 核心转储 错误 我没有正确处理 ostream 吗 include
  • 内联函数/方法

    声明 内联函数必须在调用之前定义 这个说法正确吗 EDIT 该问题最初是德语 内联功能穆森 弗 伊赫雷姆 奥夫鲁夫定义 sein 也许它对任何人都有帮助 是的 它是正确的 但只是部分正确 它可能正确地重新构建如下 内联函数必须在每个翻译单位
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • Groovy - 在对象实例化期间忽略映射中的额外属性

    有没有办法让 groovy 在对象实例化期间忽略映射中的额外属性 例子 class Banana String name def params name someGuy age 13 new Banana params 在这个例子中 gro
  • 在 C# Winforms 应用程序中嵌入 Windows XP 主题

    我有一个旧版 C Windows 窗体应用程序 其布局是根据 Windows XP 默认主题设计的 由于需要将其作为 Citrix 应用程序进行分发 该应用程序现在看起来像经典主题应用程序 因为 Citrix 不鼓励使用主题系统服务 所以
  • 如何使用MySqlCommand和prepare语句进行多行插入?(#C)

    Mysql 给出了如何使用准备语句和 NET 插入行的示例 http dev mysql com doc refman 5 5 en connector net programming prepared html http dev mysq
  • 如何将带有自定义分配器的 std::vector 传递给需要带有 std::allocator 的函数?

    我正在使用外部库 pcl 因此我需要一个不会更改现有函数原型的解决方案 我正在使用的一个函数生成一个std vector
  • C++ 插件的“最适合”动态类型匹配

    我有一个几乎所有东西都是插件的架构 该架构以图形用户界面为基础 其中每个插件都由一个 表面 即用户可以通过其与插件交互的 UI 控件 表示 这些表面也是插件 每当添加新插件时 瘦主机都会自动确定哪个可用表面与其最匹配的 UI 如何在 C 中
  • 预处理后解析 C++ 源文件

    我正在尝试分析c 使用我定制的解析器的文件 写在c 在开始解析之前 我想摆脱所有 define 我希望源文件在预处理后可以编译 所以最好的方法是运行C Preprocessor在文件上 cpp myfile cpp temp cpp or
  • 默认析构函数做了多少事情

    C 类中的默认析构函数是否会自动删除代码中未显式分配的成员 例如 class C public C int arr 100 int main void C myC new C delete myC return 0 删除 myC 会自动释放
  • C# 中的常量和只读? [复制]

    这个问题在这里已经有答案了 可能的重复 const 和 readonly 之间有什么区别 https stackoverflow com questions 55984 what is the difference between cons
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代

随机推荐

  • Python pickle 协议选择?

    我使用 python 2 7 并尝试腌制一个对象 我想知道 pickle 协议之间的真正区别是什么 import numpy as np import pickle class Data object def init self self
  • 更改node.js安装目录

    我下载了node js v5 6 0 64位的windows msi 当我执行它时 它弹出警告 无效的E 驱动器 并关闭 无法更改安装驱动器 我没有 E 驱动器 而是想安装到外部驱动器 F 当我的外部驱动器设置为 E 时 我认为以前在 E
  • 将 CSV 导入添加到 ROR 应用程序

    我正在在线订购应用程序中添加批量订单的 CSV 导入 基本上我想做的是用 CSV 数据创建一个购物车 我创建了一个导入控制器 require csv class ImportsController lt ApplicationControl
  • 将数据附加到 exe

    这个问题是我之前问题的答案之一的延伸 如何在exe中保存用户注册 C https stackoverflow com questions 5792793 how to save user registration in the exe c
  • Xcode 13 - 无法打开“/Users/test.xcodeproj”中的项目,因为它采用未来的 Xcode 项目文件格式

    在 Xcode 12 5 中打开使用 Xcode13 创建的项目时 我收到以下错误消息 无法打开位于 Users xcodeproj 的项目 因为它是未来的Xcode项目文件格式 使用兼容版本的Xcode调整项目格式 以允许该版本的Xcod
  • 对真实输入数据进行高效的 2D FFT?

    我目前正在使用 opencl 对真实输入数据实现二维 FFT 更具体地说是使用 FFT 的快速 2D 卷积 所以我只需要一些行为足够相似的东西来应用卷积 2D FFT 是在行上使用 1D FFT 然后在列上使用 1D FFT 来实现的 为了
  • 以另一种形式运行过程

    我有一个表单 运行一个在 Outlook 中创建电子邮件并向其附加 pdf 的过程 它的记录源是不可更新的查询 该程序运行良好 我现在想从另一种形式运行该过程 但我不断收到一条消息 说它无法完成 因为记录源不可更新 新形式的编码为 Priv
  • 如何在 Android 手机启动时打开我的 Android 应用程序? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在启动时启动应用程序 https stackoverflow com questions 6391902 how to start an application on startup 我是 And
  • Oracle 函数:复制 wm_concat

    我目前正在 Crystal Reports 中从事一个项目 该项目拒绝使用未记录的函数 WM CONCAT 而该函数在 Oracle 10g 中是允许的 这里是WM CONCAT头信息 WM CONCAT p1 IN VARCHAR2 RE
  • 无法在 ASP.NET Zero 中启用实体历史记录

    我正在使用 ASP NET 零 项目版本 5 1 0和 NET Core 2 0 模板 我正在尝试为我的实体启用实体历史记录 以便我可以查看表中已删除的列值和旧的列值 实体类 Table TestingEntity Audited publ
  • 查找表中的重复行[重复]

    这个问题在这里已经有答案了 我有一个带有这样的表的小型应用程序 tr td img class DeleteButton alt delete src images delete icon png td td class toHide so
  • 如何删除mysql表中的数字字符?

    我有一张桌子 名称为 Actress 在 MySQL 中 我想从列 中删除所有数字字符name select from Actress limit 5 code name 11455 Hanshika Motwani 19 11457 Ka
  • memcached 是否在 Google App Engine 中跨服务器共享?

    在memcached网站上 它说memcached是一个分布式内存缓存 这意味着它可以跨多个服务器运行并保持某种一致性 当我在谷歌应用程序引擎中发出请求时 同一实体组中的请求很可能由同一服务器提供服务 我的问题是 假设有两台服务器为我的请求
  • 为什么 GLSL 的算术函数在 iPad 上与在模拟器上产生如此不同的结果?

    我目前正在寻找在 iOS 设备上运行的 OpenGL ES 2 0 片段着色器代码中的一些错误 代码在模拟器中运行良好 但在 iPad 上它存在巨大问题 并且某些计算产生截然不同的结果 例如我有0 0在 iPad 上和4013 17在模拟器
  • 将 csv 附加到电子邮件 xcode

    我在电子邮件视图中收到了一个有效的 csv 附件 问题是 当我在 iPhone 上打开 csv 时 它会将文件很好地显示在单独的列中 但如果我用 Excel 打开它 它就全部在一个字段中 我需要两列 我该怎么做 尝试用逗号分隔字段 但这不起
  • IPv4 到十进制不同的值?

    为什么 inet pton 和 inet addr 1734763876 的 IPv4 十进制值与使用这 2 个网站 1684366951 得到的值不同 struct sockaddr in sin inet pton AF INET 10
  • Java 类文件的创建是确定性的吗?

    当使用same JDK 即相同的javac可执行文件 生成的类文件总是相同的吗 是否会有差异 具体取决于操作系统 or hardware 除了JDK版本之外 是否还有其他因素导致差异 是否有任何编译器选项可以避免差异 差异仅可能存在于理论上
  • 查找 Active Directory 中特定用户所属的组/分发列表

    假设我在 OU Groups DC contaco DC com ct 我可以找到子 OU 中的所有组 但找到用户 bobdole 所属的所有组的唯一方法是查看每个组 看看他是否在 成员 字段中 不幸的是 当我查看用户 bobdole 时
  • 如何使div的宽度在两个div之间拉伸

    我当前的问题是我有三个 div 元素 一只向左漂浮 一只向右漂浮 一只在两者之间 我希望中心 div 自动拉伸到两个 div 之间可用宽度的最大宽度 HTML div div 1 div div div div 2 div div CSS
  • 控制何时调用静态构造函数

    在我的自定义属性的静态构造函数中 我在加载的程序集中搜索用我的属性修饰的所有类 并对它们执行一些操作 我希望在运行时尽快调用静态构造函数 最好是在执行之前static void Main 入口点 目前 只有在我对属性进行一些调用后才会调用它