DebuggerDisplay属性能够应用于Microsoft.Office.Interop.Word.Range吗?

3
根据这个问题的要求 Can the DebuggerDisplay attribute be applied to types one doesn't own,能否将DebuggerDisplay属性应用于外部程序集中的类型?
如果可以,有没有一种特定的方式将其应用于Microsoft.Office.Interop.Word.Range
我尝试了以下代码但没有成功:
<Assembly: DebuggerDisplay("text: {Text}", Target:=GetType(Word.Range))>

在运行时调试器中会显示这个字符串:

{System.__ComObject}

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


调试器可能不能像运行时代码一样使用用于COM对象的透明代理。尝试使用“DebuggerTypeProxy”代替(即使这需要多做一些工作)。 - Jeroen Mostert
@JeroenMostert 你能给一个 DebuggerTypeProxy 的例子吗? - google dev
请点击此链接 Sure 以了解如何使用 DebuggerDisplay 属性和 DebuggerTypeProxy - Jeroen Mostert
1个回答

7
但是 '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";
    }
}

现在您可以设置DebuggerDisplay属性:
[assembly: DebuggerDisplay("text: {FullNamespace.Here.DisplayHelper.DisplayRange(this)}"
           , Target = typeof(MarshalByRefObject))]

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

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

enter image description here


我能否将其应用于类中的所有对象类型,比如一个特定的命名空间?这个可以工作,但我能否避免为所有类型重复它?我的扩展接受对象。 [assembly: DebuggerDisplay("{WebApi.Models.DebuggerExtension.ToDebuggerString(this)}", Target = typeof(WebApi.Models.User))] - VladL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接