根据写入的内容here,我可以将DebuggerDisplay属性应用于外部程序集中的类型。
如果是这样,有没有办法适用于Microsoft.Office.Interop.Word.Range,我尝试了以下代码并且它不起作用:
<Assembly: DebuggerDisplay("text: {Text}", Target:=GetType(Word.Range))>
在运行时,Debuger会显示此字符串:
{System.__ComObject}
但'System .__ ComObject'无法访问,因为它是'Friend'。
答案 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
替换为您的实际命名空间)。
以下是调试器中的结果视图: