【问题标题】:How to ensure that a static constructors is called without calling any member如何确保调用静态构造函数而不调用任何成员
【发布时间】:2013-04-28 21:09:45
【问题描述】:

我有一个带有静态构造函数的类。

我希望在不调用或使用其任何成员的情况下调用静态构造函数,但前提是尚未调用构造函数。

我尝试使用反射。通过反射,我可以调用静态构造函数(很多次),但我无法确定它之前是否已经被调用过。

我该怎么做?

编辑
这不仅是我所说的一门课,还可能更多。可以说,所有标有特殊属性的类。

【问题讨论】:

  • 设置一个标志。如果您正在设置一些静态状态,则只需要运行静态构造函数,因此设置该状态,然后查看是否设置了构造函数再次运行。
  • @Robert:我需要它是一个通用的解决方案。我事先不知道有多少课,哪些课。标记它不会有帮助,因为 .NET 在调用构造函数时不会设置该标记。
  • 你让我好奇了。为什么你觉得有必要在调用任何成员之前运行构造函数,如果这就是它要做的事情吗? (静态构造函数将在执行第一个方法或属性调用之前被调用。在第一个方法或属性被触及之前,任何静态状态都是无关紧要的)。
  • @RobertHarvey:大概是由于副作用,例如在某个中心工厂注册类型。我通常认为这种事情是应该尽可能避免的,但有时它可能是各种丑陋选择中最好的。
  • @Robert:乔恩猜对了。我正在尝试一些插件系统。如果插件文件夹中存在 DLL,则必须加载它。标有 [Register] 属性的类以集中类型注册。标记为 [AutoInitialize] 的其他类型会自动初始化,以便它们可以开始监听事件或类似的事情。

标签: c# static constructor static-constructor


【解决方案1】:

您可以使用RuntimeHelpers.RunClassConstructor 方法(假设我正确理解了您要执行的操作...)

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

【讨论】:

  • 构造函数只运行一次吗?
  • @RobertHarvey,是的,它只运行一次静态构造函数,即使你多次调用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多