将对象转换为在C#中键入Dynamic

时间:2016-03-22 06:55:43

标签: c# type-conversion dynamictype

我正在尝试将Object转换为动态类型,但转换失败并出现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);

引发的异常是:

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

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

4 个答案:

答案 0 :(得分:16)

这是将对象转换为动态

的扩展方法
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;
    }

答案 1 :(得分:8)

你应该使用JsonConvert。 Fist of all,Serialize对象为string,然后将字符串反序列化为动态。

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

答案 2 :(得分:2)

例外是:

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

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

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

希望这有帮助

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

var strForWriteLine = dynSum.ToString();

strForWriteLine的类型是 dynamic {string}

答案 3 :(得分:0)

尝试以下方法:

dynSum = objSum;