我正在编写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' 因为它有一个条件属性
我得到的问题是,对于条件属性,需要处理动态在运行时解析到的类型的代码版本可能已经编译出来,但我明确地将我要调试的内容转换为字符串,所以我不明白为什么这仍然发生。我该如何解决这个问题?
答案 0 :(得分:45)
你在这里使用var
感到很痛苦,这是我的猜测。
我假设Contents
是dynamic
。
考虑这个例子:
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
。
或者,您可以通过明确声明frame
为TextFrame
来静态化。
答案 2 :(得分:3)
没有人这样说过,所以我愿意。
更改
var str = frame.Contents.ToString();
到
string str = frame.Contents.ToString();