熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

C#基礎應用--Extension

2013-11-13 10:04:43  來源: .NET編程 

  前幾天有同事問到我一個簡單的功能 就是當你使用枚舉時如何給每個一元素增加描述字符串並且可以很容易的讀取出來
   
    比如有一個枚舉類型是列出對一個問題給出的選項(例如 同意?不同意?中立?)
   
    public enum AssessmentAnswer
   
    {
   
    Strongly_Disagree =
   
    Disagree =
   
    Neutral =
   
    Agree =
   
    Strongly_Agree =
   
    }
   
    當選擇不同的答案時 希望得到一些描述性的語句比方說 強烈的反對 反對 持中立觀點 同意 完全的同意   當然你可以建立一個表格存放這些信息 但是我想起幾年前我在網上一個 EnumDescription (忘記了是在哪裡下載的) 就可以實現這一功能 讓我們一起來看看是怎麼樣用 Extension 做到的   實現 首先定義一個EnumDescription 類
   
    public class EnumDescription : Attribute
   
    {
   
    public string Text
   
    {
   
    get { return _text; }
   
    } private string _text;
   
    public EnumDescription(string text)
   
    {
   
    _text = text;
   
    }
   
    }
   
    注意它的父類是Attribute 因為我們希望將描述的語句作為每一個對應元素的特性 然後新建一個文件命名EnumExtensionscs
   
    public static class EnumExtensions
   
    {
   
    public static string ToDescription(this Enum enumeration)
   
    {
   
    Type type = enumerationGetType()
   
    MemberInfo[] memInfo = typeGetMember(enumerationToString())
   
    if (null != memInfo && memInfoLength >


   
    {
   
    object[] attrs = memInfo[]GetCustomAttributes(typeof(EnumDescription) false)
   
    if (null != attrs && attrsLength >
   
    return ((EnumDescription)attrs[])Text;
   
    }
   
    return enumerationToString()
   
    }
   
    }
   
    在這裡我們定義了一個擴展函數ToDescription 就像所有的擴展函數一樣它的參數是類似(this …)
   
    這個函數首先用GetType 得到了當前枚舉的類型 然後借助 GetMember按照元素的名字(值) 得到這個特定的元素 最後用GetCustomAttributes 得到描述的內容
   
    這個擴展函數實現後我們可以修改枚舉的定義加入描述
   
    public enum AssessmentAnswer { [EnumDescription(強烈的反對)] Strongly_Disagree =
   
    [EnumDescription(反對)]
   
    Disagree =
   
    Neutral =
   
    Agree =
   
    [EnumDescription(完全的同意)]
   
    Strongly_Agree =
   
    }
   
    當要獲取描述語句時 你可以輕松的調用ToDescription :
   
    //返回 強烈的反對
   
    AssessmentAnswerStrongly_DisagreeToDescription()
   
    注意 如果沒有給元素加入特性 你仍舊可以使用ToDescription 可以參考上面的代碼看看是為什麼
   
    //返回 Disagree
   
    AssessmentAnswerDisagreeToDescription()
   
    總結
   
    擴展方法作為特殊的靜態方法使您能夠向現有類型添加方法而無需創建新的派生類型重新編譯或以其他方式修改原始類型
   
    對於用 和 Visual Basic 編寫的客戶端代碼調用擴展方法與調用在類型中實際定義的方法之間沒有明顯的差異
   
    給初學者的話 一旦當你實現擴展方法後 你只需要復制dll 添加文件命名空間 或者復制cs文件到你的項目中 就可以使用這些方法  但是建議除非你有充分的理由才實現擴展方法
   
    很多我們要用到的擴展方法都可以在網上得到 所以一般在寫自己的擴展前請先搜索一下


From:http://tw.wingwit.com/Article/program/net/201311/12484.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.