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

Tim*_*ing 27 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Ser*_*rvy 46

你被var这里的使用所困扰,是我的猜测.

我假设Contents是的dynamic.

考虑这个例子:

dynamic d = null;
var s = d.ToString();
Run Code Online (Sandbox Code Playgroud)

sdynamic不是string.

你想object在调用之前将对象强制转换为ToString或者将结果转换ToString为a string.重点是,在某个时刻,某个地方,你需要一个演员来摆脱这个dynamic循环.

这就是我解决它的方法:

string str = ((object)frame.Contents).ToString();
Debug.WriteLine(str);
Run Code Online (Sandbox Code Playgroud)

要么

string str = frame.Contents.ToString() as string;
Debug.WriteLine(str);
Run Code Online (Sandbox Code Playgroud)


Hog*_*gan 6

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

改变

 var str = frame.Contents.ToString();
Run Code Online (Sandbox Code Playgroud)

 string str = frame.Contents.ToString();
Run Code Online (Sandbox Code Playgroud)


SLa*_*aks 5

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

这不是真的。

var str = frame.Contents.ToString();
Run Code Online (Sandbox Code Playgroud)

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

您需要将其显式声明为string

另外,您可以通过显式声明frame为来更早地进行静态化TextFrame