我正在尝试将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语句时抛出异常。
答案 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;