gpt4 book ai didi

c# - 为什么在调用方法时使用带有动态的 json.net 得到 RuntimeBinderException

转载 作者:太空狗 更新时间:2023-10-29 23:17:41 27 4
gpt4 key购买 nike

为什么当我在 json.net 中使用 dynamic 时,我得到一个运行时绑定(bind)异常,然后调用一个没有转换的方法,但我可以做赋值没有问题

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 库中的问题还是语言限制。

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

最佳答案

这是因为 json.Test 返回一个 JValueJValue 有一个动态的 TryConvert。因此,如果您通过将它指向 int 或转换为 int 来进行隐式静态转换,它将在运行时调用 TryConvert 并且您有成功。但是,如果您在方法参数中使用该动态类型变量,C# 运行时会查找名为 Func 的方法,其参数最匹配“JValue”,它不会尝试为每个排列调用“TryConvert”一个可能的方法(即使它只有一个)因此你会得到运行时绑定(bind)错误。

因此,最简单的解决方案是在每次调用时强制转换,或者在每次您想将 JValue 作为参数传递时设置一个静态类型的变量。

如果您正在寻找更多信息,实际上还有一个关于同一问题的更一般的问题和答案: Pass a dynamic variable in a static parameter of a method in C# 4

关于c# - 为什么在调用方法时使用带有动态的 json.net 得到 RuntimeBinderException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8067621/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com