最佳答案
我在一段返回 JSON 的代码上编写了一个单元测试。它返回的类型是一个匿名类型,所以我想验证它上面的值,我只需要将对象强制转换为 dynamic
来执行断言。
但是,当我这样做时,我的构建失败了,但是我没有任何错误消息。我能够在一个新的单元测试项目中用非常简单的代码重现这一点:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
下面是构建失败的截图
不过,当我注释掉断言时,构建就会成功:
相比之下,我在 LinqPad 5 beta (使用罗斯林编译器)中运行了以下代码,没有任何问题:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
没错
这是怎么回事?由于错误没有显示出来,我无法判断我是否正确地使用了 dynamic
,或者由于 dynamic
的原因,它无法找到用于 IsTrue()
的重载,或者这是编译器中的一个 bug (尽管我非常怀疑这一点,但我没有任何证据表明我的代码有问题)。
关于重载问题,我尝试了 Assert.IsTrue((bool)asDynamic.someValue);
,但构建仍然失败,仍然没有错误消息。
根据@RonBeyer 的评论,我也尝试过更多的演员阵容,比如下面的,但都没有效果:
dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
经过仔细检查,我发现“输出”窗口中列出了一个错误:
C: ... DynamicBuildFalse Test UnitTest1.cs (16,33,16,42) : error CS0656: 缺少编译器所需的成员‘ Microsoft.CSharp. RuntimeBinder.CSharpArgumentInfo. Create’
好的,VS2013更善于报告错误,我将根据这些来搜索:
好的,添加对 Microsoft.CSharp 的引用修复了构建错误,但是我将留下这个问题,因为它可能是 VS2015的一个问题,(在我看来)应该得到解决。