为什么我必须在使用之前将JValue显式地转换为目标类型?

时间:2013-04-22 10:34:46

标签: c# json dynamic json.net

我有一些像这样的代码:

var jsonSerializer = new JsonSerializer();
var json = @"{ ""LastModifiedTime"": ""2013-04-19T18:18:09+03:00"" }";
var result = jsonSerializer.Deserialize<dynamic>(new JsonTextReader(new StringReader(json)));

File.SetLastWriteTime("c:/temp/somefile.txt", result.LastModifiedTime);

然而,这给了我(在运行时,因为我们在这里谈论动态):

RuntimeBinderException
The best overloaded method match for 'System.IO.File.SetLastWriteTime(string, System.DateTime)' has some invalid arguments 

这感觉有点傻。对我而言,动态的一点是必须明确指定类型等等;这应该(理想情况下)由运行时处理。当然,JSON.NET可能有点难以在给定的情况下知道它应该伪装成什么......

James(或其他熟悉JSON.NET内部的人),这是设计的吗?如果我添加这样的手动DateTime演员:

File.SetLastWriteTime("c:/temp/somefile.txt", (DateTime) result.LastModifiedTime);

......一切正常。

1 个答案:

答案 0 :(得分:3)

在发布之前找到答案here ...

事实证明我要么强制转换,要么使用JValue的Value属性。不过,关于这个的一些更多细节将是很好的。当然,只要能够神奇地使用我的JValue作为第三方方法的参数而不必担心强制转换将是最佳的,给予JSON最强大的“动态语言”体验(非常棒!)。 NET。