9

属性 [DebuggerDisplay] ( Using DebuggerDisplayAttribute ) 允许在 VS 2010/2008 的调试器中定义显示。通过修改 AutoExp.cs/.dll,我什至可以覆盖系统类型和第 3 方类型的显示,例如

[assembly: DebuggerDisplay (@"\{Name = {Name} FullName = {FullName}}", Target = typeof (Type))]

在内花括号中,我可以引用字段、属性和方法。是否可以引用扩展方法

例如,我尝试显示较短的类型名称,例如,$SCG.Dictionary而不是System.Collections.Generic.Dictionary. 我将此添加到 AutoExp.cs:

using DbgDisp;

[assembly: DebuggerDisplay (@"\{Name = {Name} ShortName = {ShortName()}}", Target = typeof (Type))]

namespace DbgDisp {
  public static class Ext {
    public static string ShortName (this Type t) { return string.Format ("[{0}]", t.Name); }
  } // Ext
} // DbgDisp

但调试器抱怨:当前上下文中不存在名称“ShortName”。

我是否遗漏了一些东西,或者只是不能在那里使用扩展方法?

我知道我可以覆盖ToString (),但这仅对我自己的类型有帮助。

4

3 回答 3

10

实际上,您可以使用扩展方法将其作为参数传递

[assembly: DebuggerDisplay(@"NetGuid = {ToString()} OracleGuid = {GuidExtensions.ToVarChar(this)}", Target = typeof(Guid))]
public static class GuidExtensions
{
    public static string ToVarChar(this Guid guid)
    {
        var newBytes = new byte[16];
        var oldBytes = guid.ToByteArray();
        for (var i = 8; i < 16; i++)
            newBytes[i] = oldBytes[i];

        newBytes[3] = oldBytes[0];
        newBytes[2] = oldBytes[1];
        newBytes[1] = oldBytes[2];
        newBytes[0] = oldBytes[3];
        newBytes[5] = oldBytes[4];
        newBytes[4] = oldBytes[5];
        newBytes[6] = oldBytes[7];
        newBytes[7] = oldBytes[6];

        return new Guid(newBytes).ToString("N").ToUpper();
    }    
}
于 2016-10-06T20:34:11.813 回答
5

简而言之,没有。由于与扩展方法不起作用的相同原因,dynamic仅从方法名称,无法知道哪些using指令有效,因此哪些扩展方法是候选方法。完全有可能出现使用不同using指令更改可用方法的情况,因此让它尝试猜测没有任何好处。

您必须将自己限制为常规方法,除非字符串允许您明确指定类的静态方法,即DbgDisp.Ext.ShortName(foo).

于 2011-04-09T11:28:39.180 回答
0

您可以在您的类中放置一个私有方法,该方法使用您想要生成字符串的扩展方法。然后该DebuggerDisplay属性可以引用该方法。

于 2014-11-20T12:26:34.217 回答