我正在尝试将一个对象转换为动态类型,但是转换失败并出现了RunTimeBinder异常。

16
我正在尝试将一个对象转换为动态类型,但是转换失败并出现了RunTimeBinder异常。我尝试使用在Stackoverflow答案中找到的两种方法。
代码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);

抛出的异常是这样的:

在未知模块中发生了类型为 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' 的第一次机会异常。

请注意,在两种情况下,当执行调试语句时都会抛出异常。

@PMF 你好,我现在已经在我的问题中添加了细节。 - JKay
1
“第一次机会”异常在使用dynamic关键字时并不罕见。您只是看到DLR探索评估表达式的方法,最快的方法就是尝试并捕获异常,如果其方法不奏效。这是一种特性,而不是错误。 - Hans Passant
@Eminem 是的。它抛出相同的异常。 - JKay
1
http://blog.jorgef.net/2011/06/converting-any-object-to-dynamic.html - Eminem
将来请添加异常信息和抛出异常的代码行。这样可以节省大家很多时间,您也会更快地得到更好的答案。通常情况下,您需要的所有信息都在您丢弃的异常数据中 :) - Luaan
显示剩余3条评论
4个回答

31

这里是将对象转换为动态类型的扩展方法。

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;
    }

13

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

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

2
或者直接在DeserializeObject中使用objectstring.ToString()。 - Sebastian Zolg
1
只有当您的所有属性都可以JSON序列化时,此方法才能正常工作。这是一个非常大的前提条件。 - Nick Strupat

4
例外情况是:
Cannot dynamically invoke method 'Write' because it has a Conditional attribute

当您检查可能的Debug.WriteLine输入时,“dynamic”不是其中之一。因此,您需要将其转换为字符串,例如:

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

希望这可以帮到你。

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

var strForWriteLine = dynSum.ToString();

strForWriteLine的类型是 动态类型 { 字符串 }


嗨,现在它正在工作。谢谢!所以转换进行得很好,问题出在Debug,Writeline上。感谢您的解释。 - JKay

1
尝试以下操作:
dynSum = objSum;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接