背景
前幾天有同事問到我一個簡單的功能, 就是當你使用枚舉時如何給每個一元素增加描述字串並且可以很容易的讀取出來.
比如有一個枚舉類型是列出對一個問題給出的選項(例如: 同意?不同意?中立?):
public enum AssessmentAnswer
{
Strongly_Disagree = 1,
Disagree = 2,
Neutral = 3,
Agree = 4,
Strongly_Agree = 5
}
當選擇不同的答案時, 希望得到一些描述性的語句比方說:1. "強烈的反對"2. "反對"3. "持中立觀點"4. "同意"5. "完全的同意" 當然你可以建立一個資料庫表格,存放這些資訊, 但是我想起幾年前,我在網上下載一個 EnumDescription 源碼(忘記了是在哪裡下載的), 就可以實現這一功能.讓我們一起來看看是怎麼樣用 Extension 做到的: 實現首先定義一個EnumDescription 類:
public class EnumDescription : Attribute
{
public string Text
{
get { return _text; }
} private string _text;
public EnumDescription(string text)
{
_text = text;
}
}
注意它的父類是Attribute, 因為我們希望將描述的語句作為每一個對應元素的特性. 然後建立一個檔案,命名EnumExtensions.cs
public static class EnumExtensions
{
public static string ToDescription(this Enum enumeration)
{
Type type = enumeration.GetType();
MemberInfo[] memInfo = type.GetMember(enumeration.ToString());
if (null != memInfo && memInfo.Length > 0)
{
object[] attrs = memInfo[0].GetCustomAttributes(typeof(EnumDescription), false);
if (null != attrs && attrs.Length > 0)
return ((EnumDescription)attrs[0]).Text;
}
return enumeration.ToString();
}
}
在這裡我們定義了一個擴充函數ToDescription, 就像所有的擴充函數一樣,它的參數是類似(this …),
這個函數首先用GetType 得到了當前枚舉的類型, 然後藉助 GetMember按照元素的名字(值), 得到這個特定的元素, 最後用GetCustomAttributes 得到描述的內容.
這個擴充函數實現後,我們可以修改枚舉的定義,加入描述:
public enum AssessmentAnswer
{
[EnumDescription("強烈的反對")]
Strongly_Disagree = 1,
[EnumDescription("反對")]
Disagree = 2,
Neutral = 3,
Agree = 4,
[EnumDescription("完全的同意")]
Strongly_Agree = 5
}
當要擷取描述語句時, 你可以輕鬆的調用ToDescription :
//返回 "強烈的反對"
AssessmentAnswer.Strongly_Disagree.ToDescription()
注意, 如果沒有給元素加入特性, 你仍舊可以使用ToDescription, 可以參考上面的代碼看看是為什麼.
//返回 “Disagree”
AssessmentAnswer.Disagree.ToDescription()
總結
擴充方法作為特殊的靜態方法使您能夠向現有類型“添加”方法,而無需建立新的衍生類別型、重新編譯或以其他方式修改原始類型。
對於用 C# 和 Visual Basic 編寫的用戶端代碼,調用擴充方法與調用在類型中實際定義的方法之間沒有明顯的差異。
給初學者的話: 一旦當你實現擴充方法後, 你只需要複製dll 添加檔案命名空間; 或者複製cs檔案到你的項目中, 就可以使用這些方法, 但是建議除非你有充分的理由才實現擴充方法。
很多我們要用到的擴充方法都可以在網上得到, 所以一般在寫自己的擴充前請先搜尋一下.
本文來自於喜樂的ASP.NET(Alex Song) 轉貼請註明出處