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

本文关键字:转换 类型 目标 JValue 为什么 | 更新日期: 2023-09-27 18:10:14

我有一些这样的代码:

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);

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

在发布之前找到了答案…

结果是,我要么必须强制转换,要么使用JValue的Value属性。不过,如果能提供更多的细节就好了。当然,只要能够神奇地使用我的JValue作为第三方方法的参数,而不必担心类型转换,这将是最理想的,为JSON.NET的这个功能提供最"动态语言"般的体验(否则真的很棒!)