为什么当我在json.net上使用dynamic时,我得到一个运行时绑定异常,然后调用一个没有强制转换的方法,但我可以做任务没有问题
private static void Main()
{
dynamic json = JObject.Parse("{\"Test\":23}");
var t = json.Test;
int a = t; //Success
Prop = t; //Success
Func(t); //RuntimeBinderException
}
private static void Func(int i){}
private static int Prop { get; set; }
当我将其转换为正确的类型时,没有错误,但我宁愿不必这样做。我做错了什么,这是json.net库中的问题还是语言限制。
编辑: 这是为了解决我无法控制方法签名的问题,我不想在每次调用时都将它强制转换。
答案 0 :(得分:4)
这是因为json.Test
返回JValue
而JValue
有动态TryConvert
。因此,如果通过将其指向int
或转换为int
来执行隐式静态转换,它将在运行时调用TryConvert
并且您已成功。但是,如果在方法参数中使用该动态类型变量,则c#运行时将查找名为Func
的方法,其参数最匹配'JValue',它不会尝试为每个可能的排列调用'TryConvert'方法(即使它只是一个)因此你得到运行时绑定错误。
所以最简单的解决方案就是在每次调用JValue
作为参数时,只对每次调用进行强制转换或设置静态类型变量。
如果您正在寻找更多信息,实际上也有一个更普遍的问题和答案: Pass a dynamic variable in a static parameter of a method in C# 4
答案 1 :(得分:0)
private static void Func(dynamic i){}
将解决问题。