所以我有这个课
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 ,这确实提供了一种方法来做我想做的事。
答案 0 :(得分:5)
为什么不只是创建一个静态方法,即Initialize(),它连接所有事件处理程序并只调用MyClass.Initialize()?
答案 1 :(得分:5)
您可以使用RuntimeHelpers.RunClassConstructor
方法运行静态构造函数:
RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle);
但是我强烈建议使用另一种方法来解决你的问题... Richard Hein的建议似乎对我很好。
答案 2 :(得分:0)
在代码中进行以下更正:
RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle);
希望这有帮助!