为什么在调用方法时使用带动态的json.net获取RuntimeBinderException

时间:2011-11-09 15:51:16

标签: c# dynamic json.net

为什么当我在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库中的问题还是语言限制。

编辑: 这是为了解决我无法控制方法签名的问题,我不想在每次调用时都将它强制转换。

2 个答案:

答案 0 :(得分:4)

这是因为json.Test返回JValueJValue有动态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){}

将解决问题。