下面举例说明扩展方法:为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<int, string> dic = new Dictionary<int, string>(); 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); } }