[英]Using extension methods in [DebuggerDisplay] Attribute
Attribute [DebuggerDisplay]( 使用DebuggerDisplayAttribute )允許在VS 2010/2008的調試器中定義顯示。 通過修改AutoExp.cs / .dll,我甚至可以覆蓋系統類型和第三方類型的顯示,例如
[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 ()
,但這只對我自己的類型有幫助。
實際上你可以使用傳遞它的擴展方法作為參數
[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();
}
}
簡而言之,沒有。 出於同樣的原因,擴展方法不能用於dynamic
,即僅從方法名稱開始,沒有辦法知道using
指令有效,因此哪些擴展方法是候選。 完全有可能使用不同的using
指令更改可用方法的場景,因此嘗試猜測沒有任何好處。
除非字符串允許您明確地在類上指定靜態方法,即DbgDisp.Ext.ShortName(foo)
,否則您必須將自己限制為常規方法。
您可以在類中放置一個私有方法,該方法使用您想要生成字符串的擴展方法。 然后, DebuggerDisplay
屬性可以引用該方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.