Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么来自动态对象的赋值会抛出RuntimeBinderException?_C# - Fatal编程技术网

C# 为什么来自动态对象的赋值会抛出RuntimeBinderException?

C# 为什么来自动态对象的赋值会抛出RuntimeBinderException?,c#,C#,为什么这段代码抛出RuntimeBinderException,我如何解决这个问题?为什么我不能在catch块中捕获此异常 如果使用System.Web.Helpers.Json.Decode(response)解析Json字符串,也会出现相同的错误 using Microsoft.CSharp.RuntimeBinder; using Newtonsoft.Json; using System; using System.Windows; namespace DynamicDemo { //

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

如果使用
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);
        }

    }
}
更新1:
将异常处理程序更改为捕获所有异常,但没有任何区别

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

  • “Newtonsoft.Json.Linq.JObject”不包含“数据”的定义
  • “Newtonsoft.Json.Linq.JObject”不包含“accountId”的定义
  • 无法将类型“Newtonsoft.Json.Linq.JValue”隐式转换为“string”。存在显式转换(是否缺少强制转换?)
所有这些都是准确的。你会看到DLR正在寻找可能的方法来找回房产。所有明显的方法都不起作用,在第二次尝试后,它会尝试JObject实现的
IDictionary
接口。除了JToken值需要强制转换之外,几乎没有其他值。第四次尝试很好

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


一切都按它应该的方式运行。

不过,您的代码可以正常工作。它在输出中打印您的账户ID。这些异常可能是在JsonConvert中捕获和处理的。我们在控制台中看到“YOUR_ACCOUNT_ID”输出这一事实让我认为,您在这里展示的代码中可能没有出现异常。您是否尝试在调试器中单步执行它?似乎需要告诉该方法将对象反序列化到哪个类。我认为您可以通过指定对象类型或作为反序列化对象方法的类型参数来实现这一点。另外,您是否检查了RuntimeBinderException在冒泡时是否未更改为其他异常类型?在捕获中,执行writeline e.消息,以便查看一些详细信息。尝试了该操作,但即使使用通用异常处理程序,也从未执行捕获块
'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.