DebuggerDisplay 属性是否可以应用于 Microsoft.Office.Interop.Word.Range?

goo*_*dev 3 .net com debugging vsto ms-office

取决于在这个问题上问什么问题Can the DebuggerDisplay attribute be applied to types one don't own,可以将该DebuggerDisplay特性应用于来自外部程序集的类型吗?

如果是这样,有没有办法将它专门应用于 a Microsoft.Office.Interop.Word.Range


我尝试了以下代码,但没有奏效:

<Assembly: DebuggerDisplay("text: {Text}", Target:=GetType(Word.Range))>
Run Code Online (Sandbox Code Playgroud)

在运行时调试器显示此字符串:

{System.__ComObject}
Run Code Online (Sandbox Code Playgroud)

但是 'System.__ComObject' 不可访问,因为它是 'Friend'。

Cod*_*ler 6

但是 'System.__ComObject' 不可访问,因为它是 'Friend'。

确实如此。但是System.__ComObject继承自 public MarshalByRefObject。和DebuggerDisplay属性会为所有派生类的工作,如果你将它设置为它们的基类。所以你可以设置typeof(MarshalByRefObject)DebuggerDisplay属性的目标。

如果你这样做,你不能只{Text}在格式化程序中使用,因为MarshalByRefObject没有这样的属性。为了克服这个问题,您可以定义简单的静态助手来检查传递的对象的类型。如果它是一个Range它会调用Text它。否则它将默认为obj.ToString()

public static class DisplayHelper
{
    public static string DisplayRange(MarshalByRefObject obj)
    {
        var range = obj as Range;
        return range?.Text ?? obj?.ToString() ?? "The value is null";
    }
}
Run Code Online (Sandbox Code Playgroud)

现在你可以设置DebuggerDisplay属性:

[assembly: DebuggerDisplay("text: {FullNamespace.Here.DisplayHelper.DisplayRange(this)}"
           , Target = typeof(MarshalByRefObject))]
Run Code Online (Sandbox Code Playgroud)

请务必为DisplayHelper类指定完整的命名空间(替换FullNamespace.Goes.Here为您的实际命名空间)。

这是调试器中的结果视图:

在此处输入图片说明