我正在尝试将 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 映射到列表并转换为对象数据类型