可能重复: 如何使用反射调用静态构造函数?
我在各种类的静态构造函数中都有一些初始化代码。我不能创建实例,也不能预先知道类型。我想确保这些类是加载的。
我试过这个:
fooType.TypeInitializer.Invoke (new object[0]);但是得到了一个MemberAccessException:类型初始化器不可调用。
我想这是因为cctor是私人的吧?有办法在不改变架构的情况下修复这个问题吗?
编辑:我找到了一个使用RuntimeHelpers.RunClassConstructor的解决方案,但这种方式似乎在MSDN中几乎没有文档,我不确定它是黑客还是合理的、类似的prod系统。
发布于 2010-12-20 13:19:37
我不知道为什么这样做,但就我的推理(在飞碟的帮助下),如果我有一个静态类
public static class Statics1
{
public static string Value1 { get; set; }
static Statics1()
{
Console.WriteLine("Statics1 cctor");
Value1 = "Initialized 1";
}
}守则:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null);
or
staticType.TypeInitializer.Invoke(new object[0]);将抛出异常,因为这将以某种方式解析为.ctor,而不是类的.cctor。
如果使用显式静态类,则它被视为抽象密封类,因此例外情况是不能实例化抽象类,如果使用带有静态构造函数的常规类,则例外情况是类型初始化器不可调用。
但是,如果我使用带有两个参数(例如,params)的调用重载,如下所示:
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);显式地声明我正在调用一个静态方法(这是第一个null -无实例==静态的意思),它可以工作并初始化该类。
也就是说,静态构造器是奇怪的野兽。以这种方式调用一个函数时,将调用静态构造函数,即使它已经执行了,即以下代码:
Console.WriteLine(Statics1.Value1);
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);将调用静态构造函数两次。因此,如果您的cctors具有潜在的重要副作用,如创建文件、打开数据库等,您可能需要重新考虑这种方法。
此外,尽管出于可读性的原因,我更喜欢静态构造函数,但从性能的角度来看,字段初始化函数比静态构造函数要稍微更快一点。
https://stackoverflow.com/questions/4489758
复制相似问题