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

时间:2018-01-23 11:02:31

标签: vb.net debugging com ms-office vsto

根据写入的内容here,我可以将DebuggerDisplay属性应用于外部程序集中的类型。

如果是这样,有没有办法适用于Microsoft.Office.Interop.Word.Range,我尝试了以下代码并且它不起作用:

<Assembly: DebuggerDisplay("text: {Text}", Target:=GetType(Word.Range))>

在运行时,Debuger会显示此字符串:

{System.__ComObject}

但'System .__ ComObject'无法访问,因为它是'Friend'。

1 个答案:

答案 0 :(得分:4)

  

但是&#39; System .__ ComObject&#39;无法访问,因为它是“朋友”。

那是真的。但是System.__ComObject继承自公共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";
    }
}

现在您可以设置DebuggerDisplay属性:

[assembly: DebuggerDisplay("text: {FullNamespace.Goes.Here.DisplayHelper.DisplayRange(this)}", Target = typeof(MarshalByRefObject))]

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

以下是调试器中的结果视图:

enter image description here