如何将Debug.Write与动态数据一起使用?

时间:2012-12-31 18:17:53

标签: c# visual-studio-2010

我正在编写Adobe 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'   因为它有一个条件属性

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

3 个答案:

答案 0 :(得分:45)

你在这里使用var感到很痛苦,这是我的猜测。

我假设Contentsdynamic

考虑这个例子:

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

s dynamic不是string

您需要在调用object之前将对象强制转换为ToString,或将ToString的结果投射到string。关键是,在某个地方,某个地方,你需要一个演员来摆脱dynamic周期。

这就是我解决它的方法:

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

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

答案 1 :(得分:5)

  

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

事实并非如此。

var str = frame.Contents.ToString();

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

您需要明确声明为string

或者,您可以通过明确声明frameTextFrame来静态化。

答案 2 :(得分:3)

没有人这样说过,所以我愿意。

更改

 var str = frame.Contents.ToString();

 string str = frame.Contents.ToString();