首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何显式地运行未知类型的静态构造函数?

如何显式地运行未知类型的静态构造函数?
EN

Stack Overflow用户
提问于 2010-12-20 12:47:38
回答 1查看 1.8K关注 0票数 7

可能重复: 如何使用反射调用静态构造函数?

我在各种类的静态构造函数中都有一些初始化代码。我不能创建实例,也不能预先知道类型。我想确保这些类是加载的。

我试过这个:

代码语言:javascript
复制
fooType.TypeInitializer.Invoke (new object[0]);

但是得到了一个MemberAccessException:类型初始化器不可调用。

我想这是因为cctor是私人的吧?有办法在不改变架构的情况下修复这个问题吗?

编辑:我找到了一个使用RuntimeHelpers.RunClassConstructor的解决方案,但这种方式似乎在MSDN中几乎没有文档,我不确定它是黑客还是合理的、类似的prod系统。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-12-20 13:19:37

我不知道为什么这样做,但就我的推理(在飞碟的帮助下),如果我有一个静态类

代码语言:javascript
复制
public static class Statics1
{
    public static string Value1 { get; set; }

    static Statics1()
    {
        Console.WriteLine("Statics1 cctor");
        Value1 = "Initialized 1";
    }
}

守则:

代码语言:javascript
复制
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null);
or
staticType.TypeInitializer.Invoke(new object[0]);

将抛出异常,因为这将以某种方式解析为.ctor,而不是类的.cctor。

如果使用显式静态类,则它被视为抽象密封类,因此例外情况是不能实例化抽象类,如果使用带有静态构造函数的常规类,则例外情况是类型初始化器不可调用。

但是,如果我使用带有两个参数(例如,params)的调用重载,如下所示:

代码语言:javascript
复制
Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);

显式地声明我正在调用一个静态方法(这是第一个null -无实例==静态的意思),它可以工作并初始化该类。

也就是说,静态构造器是奇怪的野兽。以这种方式调用一个函数时,将调用静态构造函数,即使它已经执行了,即以下代码:

代码语言:javascript
复制
Console.WriteLine(Statics1.Value1);

Type staticType = typeof (Statics1);
staticType.TypeInitializer.Invoke(null, null);

将调用静态构造函数两次。因此,如果您的cctors具有潜在的重要副作用,如创建文件、打开数据库等,您可能需要重新考虑这种方法。

此外,尽管出于可读性的原因,我更喜欢静态构造函数,但从性能的角度来看,字段初始化函数比静态构造函数要稍微更快一点。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4489758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档