33

我正在编写 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”,因为它具有条件属性

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

4

3 回答 3

52

我猜你被你在var这里的使用所咬伤。

我假设Contentsdynamic

考虑这个例子:

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

s不是。dynamic_string

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

这就是我解决它的方法:

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

或者

string str = frame.Contents.ToString() as string;
Debug.WriteLine(str);
于 2012-12-31T18:22:19.230 回答
8

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

事实并非如此。

var str = frame.Contents.ToString();

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

您需要将其显式声明为string.

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

于 2012-12-31T18:21:43.660 回答
5

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

改变

 var str = frame.Contents.ToString();

 string str = frame.Contents.ToString();
于 2012-12-31T18:23:58.103 回答