也许通过反射调用静态类型初始值设定项

时间:2010-09-19 19:54:42

标签: c# reflection

所以我有这个课

public static class MyClass
{
    static MyClass()
    {
        ...
    }
}

没有方法,字段或属性。它所做的就是将处理程序连接到其他地方定义的静态事件。

由于类型初始化程序永远不会被调用,因为实际上从未访问过静态类,所以事件不会被连接起来。

所以我希望能够通过反射ala typeof(MyClass).TypeInitializer().Invoke(...)调用类型初始值设定项,但有一个例外,即MyClass是一个抽象类。

最终,应用程序将拥有其他静态类,其格式与业务规则相对应。在将任何内容保存到数据库之前,会触发与要保存的对象类型相对应的静态事件。因此,如果我想做的事情最终无法实现,那么任何重构建议都必须遵循这种结构。

编辑:

我可能不太清楚我正在尝试做什么。基本上我有一个数据层,您可以在其中初始化DataContext的实例,然后在调用SubmitChanges()时检查ChangeSet是否插入/更新/删除并触发静态事件插入/更新/删除的每种类型。这一切都很有效,我只是在寻找一种方法,在应用程序启动时将处理程序连接到事件。所以我正在玩的是:

static DataContext()
{
    System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
        .Where(t => t.Namespace == 'Data.Business')
        .ToList()
        .ForEach( t => { 
            // invoke the static TypeInitializer here,
            // so that it can wire up it's event handlers.
        });
}

我可以使用静态Initialize方法,但由于这些方法只能初始化一次,我在想TypeInitializer

编辑2:

我已经阅读了 MEF ,这确实提供了一种方法来做我想做的事。

3 个答案:

答案 0 :(得分:5)

为什么不只是创建一个静态方法,即Initialize(),它连接所有事件处理程序并只调用MyClass.Initialize()?

答案 1 :(得分:5)

您可以使用RuntimeHelpers.RunClassConstructor方法运行静态构造函数:

RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle);

但是我强烈建议使用另一种方法来解决你的问题... Richard Hein的建议似乎对我很好。

答案 2 :(得分:0)

在代码中进行以下更正:

RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle); 

希望这有帮助!