Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Debug.Write和动态数据?_C#_Visual Studio 2010 - Fatal编程技术网

C# 如何使用Debug.Write和动态数据?

C# 如何使用Debug.Write和动态数据?,c#,visual-studio-2010,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

我正在编写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,如下所示:

foreach (dynamic pi in current.PageItems)
{
    if (pi is TextFrame)
    {
        var frame = pi as TextFrame;
        var str = frame.Contents.ToString();
        Debug.WriteLine(str);
    }
}
其他信息:无法动态调用方法“WriteLine” 因为它有一个条件属性

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

但我将要调试的内容显式转换为字符串

事实并非如此

var str = frame.Contents.ToString();
这条线仍然是完全动态的

您需要将其显式声明为
字符串


或者,您可以通过显式地将
frame
声明为
TextFrame
来进行静态化,我猜您正在被
var
的使用咬到

我假设
内容
动态的

考虑这个例子:

dynamic d = null;
var s = d.ToString();
s
动态的
不是
字符串

在调用
ToString
之前,您需要将对象强制转换为
object
,或者将
ToString
的结果强制转换为
字符串。关键是在某个时刻,某个地方,你需要一个演员来摆脱动态的循环

这就是我解决问题的方法:

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


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

改变

 var str = frame.Contents.ToString();


该死的,我发誓我以前用显式类型声明尝试过这个,但这解决了它!这就是我总是告诉初级开发人员显式声明其类型的原因之一,直到他们理解隐式声明的含义为止。@MetroSmurf就是这样,并且知道通常什么时候应该避免它。在处理
dynamic
时,避免使用
var
是非常有用的,因为对于读者来说,一个特定变量是否是
dynamic
通常并不明显,即使是对所有基本概念相当熟悉的人。这是一个“别让我思考!”的时代。我责怪Resharper,如果你明确声明一个它认为可能是
var
@TomDeloford的类型,它会对你发牢骚,这在事实上是不正确的。他使用的
var
是他很难看到这个问题的原因,几乎可以肯定是他不理解这个问题的原因。如果他没有在这里使用它,他几乎肯定不会有这个问题。他之所以苦苦挣扎,是因为他在这里使用了
var
,这正是困扰他的原因。
或者,您可以更早地将frame显式声明为TextFrame
他已经是了内容本身是动态的。这不仅仅是动态的,因为他没有将容器转换为它的实际类型。
 string str = frame.Contents.ToString();