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'。
但是 '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为您的实际命名空间)。
这是调试器中的结果视图:
| 归档时间: |
|
| 查看次数: |
151 次 |
| 最近记录: |