【问题标题】:How can I use Debug.Write with dynamic data?如何将 Debug.Write 与动态数据一起使用?
【发布时间】:2012-12-31 18:17:52
【问题描述】:

我正在编写一些 Adob​​e InDesign 脚本。他们的 COM 实现确实是为 VB 设计的,因此对报告数据类型并不严格,偶尔需要使用动态。

我正在尝试调试一段如下所示的代码:

foreach (dynamic pi in current.PageItems)
{
    if (pi is TextFrame)
    {
        var frame = pi as TextFrame;
        var str = frame.Contents.ToString();
        Debug.WriteLine(str);
    }
}

这给了我一个像这样的 RuntimeBinderException:

附加信息:无法动态调用方法“WriteLine” 因为它有条件属性

我知道问题在于,使用条件属性时,需要处理动态在运行时解析为的类型的代码版本可能已经编译出来,但我明确地将我想要调试的内容转换为字符串,所以我不明白为什么仍然会发生这种情况。我该如何解决这个问题?

【问题讨论】:

    标签: c# visual-studio-2010


    【解决方案1】:

    我猜你在这里使用var 被咬了。

    我假设Contentsdynamic

    考虑这个例子:

    dynamic d = null;
    var s = d.ToString();
    

    sdynamic 不是 string

    您需要在调用ToString 之前将对象转换为object,或者将ToString 的结果转换为string。关键是,在某个时刻,某个地方,你需要一个演员才能摆脱dynamic 循环。

    这就是我的解决方法:

    string str = ((object)frame.Contents).ToString();
    Debug.WriteLine(str);
    

    string str = frame.Contents.ToString() as string;
    Debug.WriteLine(str);
    

    【讨论】:

    • 该死,我发誓我以前曾尝试过使用显式类型声明,但它修复了它!
    • 这是我总是告诉初级开发人员明确声明他们的类型直到他们理解隐式声明的含义的原因之一。
    • @MetroSmurf 就是这样,并且通常还知道什么时候应该避免它。在处理dynamic 时,避免var 特别有用,因为对于读者来说,特定变量是否为dynamic 通常并不明显,即使对于那些相当熟悉所有基本概念的人来说也是如此。这是其中之一“不要让我思考!”次。
    • 我责怪 Resharper,如果你明确声明它认为可能是 var 的类型,它就会对你发牢骚。
    • @TomDeloford 实际上不是不正确。他使用var 是他很难看到这个问题的原因,几乎可以肯定是他不理解这个问题的原因。如果他没有在这里使用它,他几乎肯定不会遇到这个问题。他挣扎的原因是因为他在这里使用var,所以在咬他的东西。
    【解决方案2】:

    但我明确地将要调试的内容转换为字符串

    事实并非如此。

    var str = frame.Contents.ToString();
    

    这条线仍然是完全动态的。

    您需要将其显式声明为string

    或者,您可以通过将 frame 显式声明为 TextFrame 来提前进行静态化。

    【讨论】:

    • Alternatively, you could static-ize earlier by explicitly declaring frame as TextFrame 他已经是了。 Contents,属于TextFrame,本身就是dynamic。这不仅仅是dynamic,因为他还没有将容器转换为它的实际类型。
    【解决方案3】:

    没有人这么说,所以我会。

    改变

     var str = frame.Contents.ToString();
    

     string str = frame.Contents.ToString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-28
      • 2015-11-30
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 1970-01-01
      相关资源
      最近更新 更多