gpt4 book ai didi

c# - 为什么动态对象的赋值会抛出 RuntimeBinderException?

转载 作者:行者123 更新时间:2023-12-02 20:03:59 26 4
gpt4 key购买 nike

为什么这段代码会抛出 RuntimeBinderException?我该如何解决这个问题?为什么我不能在 catch block 中捕获这个异常?

如果我使用 System.Web.Helpers.Json.Decode(response) 解析 json 字符串,也会出现同样的错误。

using Microsoft.CSharp.RuntimeBinder;
using Newtonsoft.Json;
using System;
using System.Windows;

namespace DynamicDemo
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();

try
{
String response = "{ \"data\":{ \"accountId\":\"YOUR_ACCOUNT_ID\"},\"message\":null}";
dynamic obj = JsonConvert.DeserializeObject(response);
String account = obj.data.accountId;
Console.WriteLine(account);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}

}
}

}

输出...

'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\PresentationFramework.Aero2\v4.0_4.0.0.0__31bf3856ad364e35\PresentationFramework.Aero2.dll'. Symbols loaded.
'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Numerics\v4.0_4.0.0.0__b77a5c561934e089\System.Numerics.dll'. Symbols loaded.
'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Dynamic\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Dynamic.dll'. Symbols loaded.
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'Anonymously Hosted DynamicMethods Assembly'.
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
YOUR_ACCOUNT_ID
'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'C:\PROGRAM FILES (X86)\MICROSOFT VISUAL STUDIO 14.0\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CLIENTDIAGNOSTICS\XAMLDIAGNOSTICS\x86\WpfXamlDiagnosticsTap.dll'. Symbols loaded.
'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'C:\Windows\assembly\GAC\Microsoft.VisualStudio.OLE.Interop\7.1.40304.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.OLE.Interop.dll'. Module was built without symbols.
'DynamicDemo.vshost.exe' (CLR v4.0.30319: DynamicDemo.vshost.exe): Loaded 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\UIAutomationTypes\v4.0_4.0.0.0__31bf3856ad364e35\UIAutomationTypes.dll'. Symbols loaded.

更新1:更改了异常处理程序以捕获所有异常,但这没有什么区别

最佳答案

这完全正常。通过强制调试器在第一次出现异常时停止,您可以看到一些内容。您可能已经意外打开了该选项。

  • “Newtonsoft.Json.Linq.JObject”不包含“数据”的定义
  • “Newtonsoft.Json.Linq.JObject”不包含“accountId”的定义
  • 无法将类型“Newtonsoft.Json.Linq.JValue”隐式转换为“字符串”。存在显式转换(您是否缺少强制转换?)

所有这些都是准确的。您看到 DLR 正在寻找找回属性(property)的可能方法。所有明显的方法都不起作用,在第二次尝试后,它尝试了 IDictionary<string, JToken> JObject 实现的接口(interface)。几乎已经完成,只是 JToken 值需要进行强制转换。第四次尝试很好。

除了这些异常的成本之外,您没有遇到真正的问题。这是严格限制的,您可以再次调用 JsonConvert.DeserializeObject() 并注意您现在没有得到异常。 DLR 已经记住了最佳策略。

一切都按其应有的方式进行。

关于c# - 为什么动态对象的赋值会抛出 RuntimeBinderException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703783/

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