dynamic
来进行断言即可。但是,当我这样做时,我的构建失败了,但我没有任何错误消息。我能够在新的单元测试项目中使用非常简单的代码重现这个问题:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
请参见下面的构建失败截图。
当我注释掉断言时,构建成功:
相比之下,我在使用Roslyn编译器的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:...\DynamicBuildFailTest\UnitTest1.cs(16,33,16,42): error CS0656: 缺少编译器所需的成员“Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create”
好的,VS2013在报告错误方面做得更好,我将根据这些进行搜索:
好的,添加对Microsoft.CSharp的引用修复了构建错误, 但是我会保留这个问题,因为它可能是与VS2015有关的问题,应该得到解决。
dynamic asDynamic = (dynamic)obj;
吗?或者在断言中,注释掉 dynamic 并写成Assert.IsTrue(((dynamic)obj).someValue);
。 - Ron BeyerAssert.IsTrue((bool)asDynamic.someValue);
? - Ron Beyer