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

我正在尝试将 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 语句都会引发异常。

【问题讨论】:

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

标签: c# type-conversion dynamictype


【解决方案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 可序列化的。这是一个很大的假设。
      猜你喜欢
      • 2020-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-25
      • 2018-07-01
      • 1970-01-01
      • 2021-10-06
      • 2020-06-08
      相关资源
      最近更新 更多