1. 程式人生 > >C#擴充套件方法知多少

C#擴充套件方法知多少

      前言:上篇 序列化效率比拼——誰是最後的贏家Newtonsoft.Json 介紹了下序列化方面的知識。看過Demo的朋友可能注意到了裡面就用到過泛型的擴充套件方法,本篇打算總結下C#擴充套件方法的用法。博主打算分三個層面來介紹這個知識點,分別是:.Net內建物件的擴充套件方法、一般物件的擴充套件方法、泛型物件的擴充套件方法。

     什麼是擴充套件方法?回答這個問題之前,先看看我們一般情況下方法的呼叫。類似這樣的通用方法你一定寫過:

        static void Main(string[] args)
        {

            string
strRes = "2013-09-08 14:12:10"; var dRes = GetDateTime(strRes); } //將字串轉換為日期 public static DateTime GetDateTime(string strDate) { return Convert.ToDateTime(strDate); } //得到非空的字串 public static string GetNotNullStr(string
strRes) { if (strRes == null) return string.Empty; else return strRes; }

或者在專案中有一個類似Utils的工具類,裡面有多個Helper,例如StringHelper、XmlHelper等等,每個Helper裡面有多個static的通用方法,然後呼叫的時候就是StringHelper.GetNotNullStr("aa");這樣。還有一種普通的用法就是new 一個物件,通過物件去呼叫類裡面的非static方法。反正博主剛開始做專案的時候就是這樣寫的。後來隨著工作經驗的累積,博主看到了擴充套件方法的寫法,立馬就感覺自己原來的寫法太Low了。進入正題。

1、.Net內建物件的擴充套件方法

.Net內部也有很多定義的擴充套件方法,例如我們Linq常用的Where(x=>x==true)、Select()等等。當你轉到定義的時候你很容易看出來:public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)。當然我們也可以給.Net物件新增擴充套件方法,比如我們要給string物件加一個擴充套件方法(注意這個方法不能和呼叫的Main方法放在同一個類中):

        public static string GetNotNullStr(this string strRes)
        {
            if (strRes == null)
                return string.Empty;
            else
                return strRes ;
        }

然後在Main方法裡面呼叫:

        static void Main(string[] args)
        {
            string strTest = null;
            var strRes = strTest.GetNotNullStr();
        }

簡單介紹:public static string GetNotNullStr(this string strRes)其中this string就表示給string物件新增擴充套件方法。那麼在同一個名稱空間下面定義的所有的string型別的變數都可以.GetNotNullStr()這樣直接呼叫。strTest.GetNotNullStr();為什麼這樣呼叫不用傳引數,是因為strTest就是作為引數傳入到方法裡面的。你可以試試。使用起來就和.Net framework定義的方法一樣:

     當然除了string,你可以給.Net內建的其他物件加擴充套件方法,例如給DataGridViewRow的擴充套件方法:

//DataGridViewRow的擴充套件方法,將當前選中行轉換為對應的物件
        public static T ToObject<T>(this DataGridViewRow item) where T:class
        {
            var model = item.DataBoundItem as T;
            if (model != null)
                return model;
            var dr = item.DataBoundItem as System.Data.DataRowView;
            model = (T)typeof(T).GetConstructor(new System.Type[] { }).Invoke(new object[] { });//反射得到泛型類的實體
            PropertyInfo[] pro = typeof(T).GetProperties(BindingFlags.Instance | BindingFlags.Public);
            Type type = model.GetType();
            foreach (PropertyInfo propertyInfo in pro)
            {
                if (Convert.IsDBNull(dr[propertyInfo.Name]))
                {
                    continue;
                }
                if (!string.IsNullOrEmpty(Convert.ToString(dr[propertyInfo.Name])))
                {
                    var propertytype = propertyInfo.PropertyType;
                }
            }
            return model;
        }
View Code

這樣看上去就像在擴充套件.Net Framework。有沒有感覺有點高大上~

2、一般物件的擴充套件方法

     和Framework內建物件一樣,自定義的物件也可以增加擴充套件方法。直接上示例程式碼:

    public class Person
    {
        public string Name { set; get; }
        public int Age { set; get; }
    }
        //Person的擴充套件方法,根據年齡判斷是否是成年人
        public static bool GetBIsChild(this Person oPerson)
        {
            if (oPerson.Age >= 18)
                return false;
            else
                return true;
        }

Main方法裡面呼叫:

var oPerson1 = new Person();
oPerson1.Age = 20;
var bIsChild = oPerson1.GetBIsChild();        

和string擴充套件方法類似,就不多做解釋了。

3、泛型物件的擴充套件方法

      除了上面兩種之外,博主發現其實可以定義一個泛型的擴充套件方法。那麼,是不是所有的型別都可以直接使用這個擴充套件方法了呢?為了保持程式的嚴謹,下面的方法可能沒有實際意義,當開發中博主覺得可能存在這種場景:

public static class DataContractExtensions
{
  //測試方法
  public static T Test<T>(this T instance) where T : Test2
  {
       T Res = default(T);
       try
       {
           Res.AttrTest = instance.AttrTest.Substring(0,2);
           //其他複雜邏輯...


      }
      catch
      { }
      return Res;
  }

}

public class Test2
{
  public string AttrTest { set; get; }
}

使用擴充套件方法有幾個值得注意的地方:

(1)擴充套件方法不能和呼叫的方法放到同一個類中

(2)第一個引數必須要,並且必須是this,這是擴充套件方法的標識。如果方法裡面還要傳入其他引數,可以在後面追加引數

(3)擴充套件方法所在的類必須是靜態類

(4)最好保證擴充套件方法和呼叫方法在同一個名稱空間下

      可能你第一次使用這個會覺得很彆扭。你也許會說擴充套件方法和我以前用的static方法無論從程式碼實現還是演算法效率都差不多嘛,是的!確實差不多,但使用多了之後會發現它確實能幫你省去很多程式碼。

相關推薦

C#擴充套件方法多少

      前言:上篇 序列化效率比拼——誰是最後的贏家Newtonsoft.Json 介紹了下序列化方面的知識。看過Demo的朋友可能注意到了裡面就用到過泛型的擴充套件方法,本篇打算總結下C#擴充套件方法的用法。博主打算分三個層面來介紹這個知識點,分別是:.Net內建物件的擴充套件方法、一般物件的擴充套件方

C#——擴充套件方法

2016年11月24日 00:39:59 賈文靜 閱讀數:2866 版權宣告:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/jiadajing267/article/details/53314190 前提     小編最

C# 擴充套件方法初步學習及使用及深度拷貝方法

對於已經編譯過的dll類或者已有類但是不允許修改該類原始型別的情況下,如果我們想對其增加新方法,可以通過繼承父類,新增子類,增加新方法,也可以通過為該dll類新增擴充套件方法實現增加新方法。在C# 3.0中出現了擴充套件方法,通過擴充套件方法我們可以直接在一個現有的型別上"新增"方法。當使用擴充

C#擴充套件方法示例(this關鍵字)

        擴充套件方法能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。C#擴充套件方法第一個引數指定該方法作用於哪個型別,並且該引數以

c#擴充套件方法,協程,dotween的仿寫

擴充套件方法。 引用msdn上的一句話: “擴充套件方法使您能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。” 我們可以在沒有原始碼,不改變原始碼的基礎上,給基礎型別比如int上新增一些方法。 使用擴充套件方法的

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

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

Unity3D-C#擴充套件方法

什麼是擴充套件方法?   擴充套件方法從字面上理解是指擴充套件的方法,而對應到面向物件程式設計這個格局中則是指為一個類提供的擴充套件方法。按照我們通常的理解,我們首先需要獲得某個類的原始碼,然後在這個類程式碼中增加成員方法,這樣就可以達到為一個類提供擴充套件方法的目的。可是

c#神奇的擴充套件方法

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

C# Extension Method 擴充套件方法

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

關於C# Enum擴充套件方法的程式碼

測試列舉Enum程式碼: public enum TestEnum { [Description("Unknow")] Unknown = 0 } Enum 擴充套件程式碼如下: using System; using Syste

四、C#4.5語法新特徵-04(擴充套件方法)

一、擴充套件方法 定義: 1、擴充套件方法能夠向現有型別“新增”方法,而無需建立新的派生型別、重新編譯或以其他方式修改原始型別。 2、擴充套件方法是一種特殊的靜態方法,但可以像擴充套件型別上的例項方法一樣進行呼叫。 3、擴充套件方法被定義為靜態方法,但它們是通過例項方法語法進行呼叫的。

C#入門經典 學習筆記(九) 抽象類 密封類 靜態類 擴充套件方法

抽象類   抽象類是設計用來被繼承的。抽象類只能被用作其他類的基類。   不能建立抽象類的例項。   抽象類使用abstract修飾符宣告。   抽象類可以包含抽象成員或非抽象成員。抽象類的成員可以是抽

擴充套件方法C#)

C#擴充套件方法在不需要直接更新目標型別的情況下,獲得功能上的擴充套件。 擴充套件方法必須定義在靜態類中,並要使用this關鍵字對第一個引數(即目標型別)進行修飾。     static class MyExtensions {   &n

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

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

C#的擴充套件方法(this)

先在StringLibrary類中定義一個靜態方法,如下: public static class StringLibrary {      //第一個引數指定該方法作用於哪個型別,並且該引數以 this 修飾符為字首,當前作用於String型別,也可作用於自定義型別

C#高階程式設計六十一天----LINQ中的擴充套件方法

LINQ中的擴充套件方法 LINQ中where擴充套件方法,要想使用,必須匯入using System.Linq;我們看一下這個方法的宣告: public static IEnumerable<TSource > Where<TSource>(thi

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

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

C# 的擴充套件方法在 LINQ 中實現陣列排序

       首先定義一個數組,int[] a = { 3,1,2,4},我們要簡單的實現該陣列的排序,但是a陣列是System空間下的,沒有OrderBy()之類的方法,這是我們引入名稱空間usin

C#.NET:高階程式設計之匿名類、匿名方法擴充套件方法

 [文中插圖丟失,推薦檢視原文]!important 開篇:在上一篇中,我們瞭解了自動屬性、隱式型別、自動初始化器等所謂的新語法,這一篇我們繼續征程,看看匿名類、匿名方法以及常用的擴充套件方法。雖然,都是很常見的東西,但是未必我們都明白其中蘊含的奧妙。所以,跟著本篇的

python3在windows下三種方法使用C擴充套件

一、前言         python有時候需要用到c或者c++的庫,這裡我們將介紹三種呼叫c擴充套件的方法。分別用swig,stypes,和python C擴充套件。三種方法各有優缺點,但第三種方法最為常用。我使用到的平臺為windows10,pytho