1. 程式人生 > >C#基礎 -- Extension 擴充套件方法

C#基礎 -- Extension 擴充套件方法

 

比如有一個列舉型別是列出對一個問題給出的選項(例如: 同意?不同意?中立?):

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;
     
}
 }

------------------------------------------------------------------------------------

用系統DescriptionAttribute類代替了EnumDescription類.從而節省一個EnumDescription型別

01 public static string ToDescription(this Enum enumeration)
02 {
03 Type type = enumeration.GetType();
04 MemberInfo[] memInfo = type.GetMember(enumeration.ToString());
05 if (null != memInfo && memInfo.Length > 0)
06 {
07 object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
08 if (null != attrs && attrs.Length > 0)
09 return ((DescriptionAttribute)attrs[0]).Description;
10 }
11 return enumeration.ToString();
12 }

--------------------------------------------------------------------

注意它的父類是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檔案到你的專案中, 就可以使用這些方法, 但是建議除非你有充分的理由才實現擴充套件方法。

相關推薦

C#基礎 -- Extension 擴充套件方法

  比如有一個列舉型別是列出對一個問題給出的選項(例如: 同意?不同意?中立?): public enum AssessmentAnswer { Strongly_Disagree = 1, Disagree = 2, Neutral =

C#基礎 一(方法詳解)

命名 可選參數 編譯 標記 .com 操作 改變 根據 ref 需要知道:類和方法的關系 方法和參數修飾符 自定義方法可以有或沒有參數,也可以有或沒有返回值。可以被各種關鍵字(static、virtual、public、new等)修飾以限制其行為。

C#基礎之匿名方法實例教程

for html ora http請求 true sta open 使用方式 技術分享 本文以實例形式講解了C#的匿名方法的用法,分享給大家供大家參考之用。具體如下: 匿名方法是C# 2.0的語言新特性。首先看個最簡單的例子:class Program { static

c#神奇的擴充套件方法

以前總聽說擴充套件方法擴充套件方法,只是聽說是c#3.0後出來的新玩意,也僅僅是知道linq中用到好多的擴充套件方法,但是他究竟是個什麼東東,怎麼用它,用它的好處是什麼,總是模模糊糊,那麼我們今天就嘗試揭開它神祕的面紗。   我們現在看到每個方法都和宣告它的類關聯,但是c

C#深拷貝擴充套件方法(引用型別利用序列化實現深拷貝)

/// <summary> /// 深拷貝 /// 注意:T必須標識為可序列化[Serializable] /// </summary> /// <typeparam name="T">

Unity使用C#高階特性擴充套件方法

C#擴充套件方法 最近在工作中遇到一個問題,即在不修改原始類的情況下,為類新增新的方法和屬性,於是在C#的高階特性中發現瞭解決方案:擴充套件方法 下面的擴充套件方法的定義:              擴充套件方法有兩個限制:1 方法必須的定義在靜態類中(類中所有的擴充套件都

C#中的擴充套件方法(向已有類新增方法,但無需建立新的派生型別)

擴充套件方法使你能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。 擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。 以上是msdn官網對擴充套件方法的描述,現在我通過一個情景例子來對此進行闡釋。假設一個控制檯程式class Progr

C#基礎:匿名方法

利用委託實現一個列印完成事件 正常方法: public delegate void Print();//定義委託 class Printer{     public static void PrintFinished(){         Console.Write

Flutter——Dart Extension擴充套件方法的使用

dart的extension方法可以給已經存在的類新增新的函式,通過extension我們可以封裝一些常用方法,提高開發效率。 例一:擴充套件String 給string新增一個log列印方法 extension StringExt on String { void log() { print

C# Extension Method 擴充套件方法

擴充套件方法是C# 3.0的新特性。它為現有的型別新增方法,從而解決了使用繼承擴充套件所帶來的所有弊端。 Demo 1 簡單的擴充套件方法 using System; namespace ExtensionMethod { class Program {

C#基礎系列:擴充套件方法的使用

前言:打算分三個層面來介紹這個知識點,分別是:.Net內建物件的擴充套件方法、一般物件的擴充套件方法、泛型物件的擴充套件方法。 什麼是擴充套件方法?回答這個問題之前,先看看我們一般情況下方法的呼叫。類似這樣的通用方法你一定寫過:

【原創】開源Math.NET基礎數學類庫使用(12)C#隨機數擴充套件方法

1 /// <summary>這個類是對System.Random類的擴充套件,擴充套件方法可以生成更多型別的偽隨機數,而不是僅僅是double和Int32型別</summary> 2 /// <remarks>這個擴充套件是執行緒安全的,並且只有在Math.

C# -- 擴充套件方法的應用(Extension Methods)

當你有下面這樣一個需求的時候,擴充套件方法就會起到作用:在專案中,類A需要新增功能,我們想到的就是在類A中新增公共方法,這個顯而易見肯定可以,但是由於某種原因,你不能修改類A本身的程式碼,但是確實又需要增加功能到類A中去,怎麼辦? 這個時候擴充套件方法(Extension

[C# 基礎知識系列] 專題十五:全面解析擴充套件方法

引言:    C# 3中所有特性的提出都是更好地為Linq服務的, 充分理解這些基礎特性後。對於更深層次地去理解Linq的架構方面會更加簡單,從而就可以自己去實現一個簡單的ORM框架的,對於Linq的學習在下一個專題中將會簡單和大家介紹下,這個專題還是先來介紹服務於Li

C# 基礎知識復習(三)---方法參數傳遞

val 相同 clas 沒有 tel cal 引用傳遞 局部變量 調用 一個方法是把一些相關的語句組織在一起,用來執行一個任務的語句塊。每一個 C# 程序至少有一個帶有 Main 方法的類。 要使用一個方法,您需要: 定義方法 調用方法 按值傳遞參數 這是參數傳遞

C#方法有關內容的總結--C#基礎

programe height tasks adk 實例方法 text 三角形面積 string math.sqrt 1、靜態方法與實例方法 using System;using System.Collections.Generic;using System.Linq;u

C#基礎[4] 類的構造方法

傳遞 創建對象 返回值 void 默認 一個 col 構造方法 沒有 構造方法用來創建對象,並且可以在構造函數中對對象進行初始化。構造函數是用來創建對象的特殊方法,方法名和類名一樣,沒有返回值,連void都不用。構造函數可以有參數,new對象的時候傳遞函數參數即可 如果不指

C#基礎視頻教程3.1 常見控件類型和使用方法

pro visual 最大 check 註意 研究 技術分享 鼠標 入門 可以從左側的工具箱中找到常見的控件(你要在Form1這種窗體上) ?為了方便你也可以把工具箱整個拖過去,這樣從上到下控件都給你排好了 ?對於按鈕來說,最常見的就是他的背景顏

C#基礎—string等類的有趣方法_1

style ocs 開始 -s false string lba 插入字符 rec https://www.cnblogs.com/kakakade/p/4562467.html https://www.cnblogs.com/babietongtianta/p/49581

Java的陣列定義與方法過載——有C++基礎的Java入門(三)

目錄 一、 陣列的定義 1、定義 2、 原理 3、 賦值方式 二、Java的方法過載 1、 概念 (1) 過載 (2) 目的 2、例子 (1) 比較兩個數值的大小 (2) 執行方式及結果 一、 陣列的定義 1、定義 資料型別 [ ]&n