【发布时间】:2019-01-29 05:54:57
【问题描述】:
有没有一种方法可以在不执行静态构造函数的情况下初始化包含静态构造函数(引发异常)的类?
到目前为止我已经尝试过这些:
Activator.CreateInstance(typeof(Foo));
FormatterServices.GetUninitializedObject(typeof(Foo));
var s = new XmlSerializer(typeof(Foo));
Foo f = (Foo)s.Deserialize(new StringReader("<Foo></Foo>"));
除了使用带有 MS Fakes 或 TypeMock 之类的 CRL Profiler api 之外,这可以使用基类库中的任何 API 来完成,或者可能是非托管的。
我想使用的示例类。
public class Foo
{
static Foo()
{
throw new Exception("Populate Bar from the database, which isn't available.");
}
public int Bar { get; set; }
}
【问题讨论】:
-
没有。来自Static Constructors:“静态构造函数......在创建第一个实例或引用任何静态成员之前自动调用。”
-
获得参考后您会如何处理?
default(Foo)够吗? -
为什么你的类有一个抛出异常的静态构造函数?也许你的努力可以用来纠正这个问题。
-
我的精神力量告诉我这是一个 XY 问题。
-
尝试编写一个对其正在测试的代码做疯狂事情的自动化测试几乎没有什么价值,比如通过阻止其静态构造函数运行来违反它的合同。到那时,您的测试不再有价值,错误很可能是您使用不当造成的,而不是设计使用中的错误,并且您将无法确信您的测试正在捕捉问题,因为您'正在阻止部分代码运行。要么构建测试以正确使用代码,要么不要浪费时间进行没有告诉你任何事情的测试。
标签: c#