我正在为返回JSON的代码编写单元测试。它返回的类型是匿名类型,所以我想验证它上面的值我只是将对象强制转换为dynamic
来执行我的断言。
然而,当我这样做时,我的构建失败但我没有任何错误消息。我能够在新的单元测试项目中使用非常简单的代码重现这一点:
[TestMethod]
public void TestMethod1()
{
var obj = new { someValue = true };
dynamic asDynamic = obj;
Assert.IsTrue(asDynamic.someValue);
}
请参阅下文,了解构建失败的屏幕截图
当我注释掉断言时,构建成功了:
相比之下,我在LinqPad 5 beta(使用Roslyn编译器)中运行了以下代码并且没有问题:
var obj = new { someValue = true };
dynamic asDynamic = obj;
Console.WriteLine((asDynamic.someValue == true).ToString());
真
这里发生了什么?由于错误没有显示我无法判断我是否错误地使用dynamic
,或者它是否找不到用于IsTrue()
的重载,因为dynamic
中的Assert.IsTrue((bool)asDynamic.someValue);
,或者如果这是编译器中的错误(虽然我非常怀疑这一点,但我没有任何证据表明我的代码存在问题)。
关于过载问题,我尝试了 dynamic asDynamic = (dynamic)obj;
Assert.IsTrue(((dynamic)asDynamic).someValue);
Assert.IsTrue((bool)asDynamic.somevalue);
,但构建仍然失败,仍然没有错误消息。
Per @ RonBeyer的评论,我也试过更多的演员如下,但无济于事:
{{1}}
仔细检查后,我发现输出窗口中列出了错误:
c:... \ DynamicBuildFailTest \ UnitTest1.cs(16,33,16,42):错误CS0656:缺少编译器所需的成员' Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'
好的,VS2013更善于报告错误,我会根据这些搜索:
好的,adding a reference to Microsoft.CSharp fixed the build error,但我会将这个问题保持开放,因为它可能是VS2015的问题(在我看来)应该得到解决。
答案 0 :(得分:206)
存在编译器错误,Visual Studio 2015只是没有正确报告错误。但是,Visual Studio 2013会:
在此处回答:https://stackoverflow.com/a/13568247:
简而言之:
添加对Microsoft.CSharp的引用,以便像这样使用
dynamic
。
答案 1 :(得分:35)
有两个人在评论中指出,对于Net Core和NetStandard,有时会通过向Microsoft.CSharp
添加NuGet引用来解决此问题。
答案 2 :(得分:0)
我有一个类似的问题,唯一解决它的问题是将我的NUnit软件包升级到最新版本。
顺便说一下,当你打开Nuget窗口时,请确保你没有降级你的软件包(当我有2.0.11版本时,它显示我升级到版本2.0.9,这实际上是降级...)
答案 3 :(得分:0)
在.net 3.0项目中使用动态关键字和Newtonsoft.json这个问题。
修复是完全放弃动态并改为使用JObject:
这
dynamic locales = JObject.Parse(this.Locales);
到
JObject locales = JObject.Parse(this.Locales);