C#扩展方法

下面举例说明扩展方法:为StringBuilder添加一个index方法

新建类:StringBuilderExtension  说明:类必须是静态的,公共的。类的方法中第一个参数需是调用对象对应的类型,并加this(这样就可以点出来了)

 public static  class StringBuilderExtension
    {
      /// <summary>
      /// 扩展方法,用来获取StringBuilder中某个字符的序号
      /// </summary>
      /// <param name="sb"></param>
      /// <param name="value"></param>
      /// <returns></returns>
      public static Int32 IndexOf(this StringBuilder sb,char value)
      {
          for (Int32 index = 0; index < sb.Length; index++)
          {
              if (sb[index] == value)
                  return index;
          }
          return -1;
        
      }
 
    }
调用:
   StringBuilder sb = new StringBuilder();
   sb.Append("sfaslfolglg");
   Int32 i= sb.IndexOf('o');这时智能提示也会显示这个方法;

我们么看看,如果我们用常规的方法写这个函数,怎么写
/// <summary>
      /// 扩展方法,用来获取StringBuilder中某个字符的序号(不用点的方法)
      /// </summary>
      /// <param name="sb"></param>
      /// <param name="value"></param>
      /// <returns></returns>
      public static Int32 IndexOf( StringBuilder sb, char value)
      {
          for (Int32 index = 0; index < sb.Length; index++)
          {
              if (sb[index] == value)
                  return index;
          }
          return -1;
 
      }
这时候我们调用:int i= StringBuilderExtension(sb,'o');
必须得写出类名,点出其方法,这样麻烦很多。但要是在方法第一参数显示this,就表明调用当前所对象sb.index('o').第一个参数就是sb;
接下来我们看看为什么可以这样写,为什么VS的智能感感应可以这么快的扑捉到这个扩展方法;


当我们对一个对象sb做.操作时: sb这个对象首先检查当前类(stringBuilder)或者基类有没有这个扩展方法,再检查有没有任何的静态类定义了一个index方法,他的第一个参数是和当前用于调用方法的那个表达式的
类型匹配的一个类型,而且这个类型必须用this关键字来标识。

下面介绍给接口添加扩展方法
  /// <summary>
     /// 为接口类型,写扩展方法
     /// </summary>
     /// <typeparam name="T"></typeparam>
     /// <param name="collection"></param>
      public static void ShowItem<T>(this IEnumerable<T> collection)
     {
         foreach (var item in collection)
         {
             Console.WriteLine(item);
         }
     }
调用:
 new int[] { 1, 5, 4, 56, 234 }.ShowItem();


一段嵌套范型常用的方法
 List<Dictionary<int,string>> list = new List<Dictionary<int,string>>();
            Dictionary<intstring> dic = new Dictionary<intstring>();
            dic.Add(1,"nihoa");
            dic.Add(2,"wobuhao");
            dic.Add(3,"nimeimei");
 
            list.Add(dic) ;
 
            foreach(Dictionary<int,string> item in list)
            {
                foreach (var singel in item)
                {
                    Console.WriteLine(singel.Key+":"+singel.Value);
                }
            }


原文地址:https://www.cnblogs.com/fjsnail/p/3247923.html