我正在尝试将 Object 转换为动态类型,但转换失败并出现 RunTimeBinder 异常

Posted

技术标签:

【中文标题】我正在尝试将 Object 转换为动态类型,但转换失败并出现 RunTimeBinder 异常【英文标题】:I am trying to convert an Object to dynamic type but the conversion is failing with RunTimeBinder exception 【发布时间】:2016-07-08 23:01:01 【问题描述】:

。我尝试使用在 *** 答案中遇到的两种方法。

代码 1:

object objSum;
dynamic dynSum;
objSum = dataTableColumnChart.Compute(String.Format("Count(0)", strColumnName), "");
dynSum = Convert.ChangeType(objSum, objSum.GetType());\
Debug.Writeline(dynSum);

代码 2:

dynSum=objSum;
Debug.Writeline(dynSum);

抛出的异常是这样的:

A first chance exception of type 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' occurred in Unknown Module.

请注意,在这两种情况下,执行 Debug 语句都会引发异常。

【问题讨论】:

你确定你得到与代码 2 相同的错误吗?我不认为对动态类型的简单分配会导致异常。你能给出确切的错误信息吗? @PMF 嗨,我现在已经在我的问题中添加了详细信息。 是 Debug.Writeline(dynSum.ToString()); 抛出的异常; 当您使用 dynamic 关键字时,“第一次机会”异常并不罕见。您只是看到 DLR 正在探索评估表达式的方法,最快的方法就是尝试它并在其方法没有成功时捕获异常。功能,而不是错误。 blog.jorgef.net/2011/06/converting-any-object-to-dynamic.html 【参考方案1】:

尝试以下方法:

dynSum = objSum;

【讨论】:

【参考方案2】:

例外是:

Cannot dynamically invoke method 'Write' because it has a Conditional attribute

当您检查可能的 Debug.WriteLine 输入时,“动态”不是其中之一。 所以你需要把它转换成字符串,例如:

    string strForWriteLine = dynSum.ToString() as string;
    Debug.WriteLine(strForWriteLine);

希望对你有帮助

*编辑: 关于 dynSum.ToString() as string; 的一些细节 当您只使用 ToString() 时,您仍然会得到一个动态字符串。

var strForWriteLine = dynSum.ToString();

strForWriteLine 的类型是 dynamic string

【讨论】:

嗨,它现在正在工作。谢谢!所以转换进行得很好,问题出在 Debug,Writeline 上。谢谢你的解释。【参考方案3】:

这是将对象转换为动态的扩展方法

public static dynamic ToDynamic(this object value)
    
        IDictionary<string, object> expando = new ExpandoObject();

        foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(value.GetType()))
            expando.Add(property.Name, property.GetValue(value));

        return expando as ExpandoObject;
    

【讨论】:

【参考方案4】:

你应该使用 JsonConvert。首先,将对象序列化为字符串,然后将字符串反序列化为动态。

string str = JsonConvert.SerializeObject(objectstring);
dynamic obj = JsonConvert.DeserializeObject(str);

【讨论】:

或objectstring.ToString()直接在DeserializeObject中 这仅适用于您的所有属性都是 JSON 可序列化的。这是一个很大的假设。

以上是关于我正在尝试将 Object 转换为动态类型,但转换失败并出现 RunTimeBinder 异常的主要内容,如果未能解决你的问题,请参考以下文章

如何“动态”将 Object 类型的实例转换为其特定的数据类型?

将列类型“对象”转换为浮点数

如何将数据从 Firestore 映射到列表并转换为对象数据类型

将动态json模型转换为c#对象[重复]

当类名已知时,将 Object 类的 java 对象动态转换为给定的类

TypeError:尝试在 React 中动态生成表时无法将 undefined 或 null 转换为对象