<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
        

      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方法無論從代碼實現還是算法效率都差不多嘛,是的!確實差不多,但使用多了之后會發現它確實能幫你省去很多代碼。

       

      posted @ 2015-07-09 10:47  懶得安分  閱讀(26174)  評論(8)    收藏  舉報
      主站蜘蛛池模板: 国产人妻人伦精品婷婷| 亚洲熟女综合色一区二区三区 | 美女视频黄频大全视频| 蜜臀精品视频一区二区三区 | 天堂久久天堂av色综合| 国产午夜成人久久无码一区二区| 欧美丰满熟妇xxxx性| 精品无码一区在线观看| 在线视频中文字幕二区| 国产熟睡乱子伦视频在线播放| 午夜福利精品一区二区三区| 亚洲午夜性猛春交xxxx| 久久精品无码一区二区三区| 成人午夜大片免费看爽爽爽| 麻豆精品在线| 国内熟妇人妻色在线视频| 久国产精品韩国三级视频| 神马视频| 免费无码高H视频在线观看| 青草精品国产福利在线视频| 久久国产精品第一区二区| 亚洲va久久久噜噜噜久久狠狠 | 日韩精品一区二区三区久| 国产成人亚洲无码淙合青草| 国产99在线 | 欧美| 丁香色婷婷国产精品视频| 国产成人精品无人区一区| 南部县| 自拍偷拍一区二区三区四| 久久久久亚洲av成人网址| 国产成人精品18| 性高湖久久久久久久久| 久久道精品一区二区三区| 德钦县| 欧洲美熟女乱又伦免费视频| 免费人欧美成又黄又爽的视频| 中国china体内裑精亚洲日本| 宜宾县| 9久9久热精品视频在线观看| 4hu四虎永久在线观看| 一区二区三区精品视频免费播放|