2010-09-19 44 views
3

所以我有这个类调用通过反射静态类型初始化也许

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

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

由于Type初始值设定项永远不会被调用,因为静态类永远不会被实际访问,所以事件不会被连接起来。

所以我希望能够通过反射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阅读起来,这确实提供了一种方法做我想做的事。

+2

你有没有想过,这只是一个非常糟糕/不可行的设计? – x0n 2010-09-19 20:06:55

+0

什么是糟糕的设计?业务层?我应该把业务规则放在表示层吗?还是你的意思是静态的?我只是想,为整个数据层注册一组事件比为每个数据上下文创建一组新事件更有效。 – 2010-09-19 20:24:57

回答

5

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

+1

甚至是一个HelloWorld()方法。任何事情都会击败反思。 – 2010-09-19 20:03:25

+0

为什么人们如此反对反思?这将运行在一个类型初始值设定项中,所以性能命中可以忽略不计。 – 2010-09-20 13:20:07

+0

我不反对反思,但这是大多数事情的最后选择。有一个单独的初始化方法更简单。在这种情况下,当你完全避免使用反射时,你会得到什么?还有其他方法可以确保您的事件处理程序仅连接一次。 – 2010-09-20 13:46:56

5

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

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

不过我强烈建议使用另一种方法来解决你的问题...理查德·海恩的建议似乎完全对我好。

0

进行以下校正代码:

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

希望这有助于!