【IT168技术文档】
泛型方法的简化
调用:public static void WL<T>(T input) { Console.WriteLine(input); }
泛型委托:int a = 100; WL<int>(a); WL(a); //C#的编辑器会通过调用WL的方法获取参数类型,所以不要把泛型类型赋予方法
先定义个泛型委托Del
Lambda表达式和扩展方法public delegate void Del<T>(T item); public static void WL<T>(T input) { Console.WriteLine(input); } int a = 100; int b = 200; int c = 300; // Del<int> m1 = new Del<int>(WL<int>); //效果同下行 ,可不必传给方法类型(见1) Del<int> m1 = new Del<int>(WL); //匿名委托 Del<int> m2 = delegate(int input) { Console.WriteLine(input); }; //再进一步,C#2.0方法组转换的新功能,适用于具体委托类型和泛型委托类型 Del<int> m3 = WL; m1(a); m2(b); m3(c);
如下:
前提,如果你知道 i=>i>5 其实表示一个委托,IList<int> list = new List<int>(); list.Add(4); list.Add(5); list.Add(6); var mylist = list.Where(i=> i > 5); foreach (var item in mylist) { Console.WriteLine(item); }
类似这样的委托
然后记住这种玩意就是个委托,那么继续:delegate(int input) { return input>5; };
构造一个扩展方法:(Del是前面定义的泛型委托,扩展方法的语法假定你也知道)
测试代码:public static void Ext<T>(this T source, Del<T> D) { D(source); } //a.Ext<int>(m1); //原因如1中所述 a.Ext(m1);//就是个委托 a.Ext(i => Console.WriteLine(i)); //试试这个.然后再尝试理解LINQ命名空间里的其他方法
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 { //扩展方法必须定义在静态的类中 public static class Program { public delegate void Del<T>(T item); public static void WL<T>(T input) { Console.WriteLine(input); } public static void Ext<T>(this T source, Del<T> D) { D(source); } static void Main(string[] args) { int a = 100; int b = 200; int c = 300; // Del<int> m1 = new Del<int>(WL<int>); //效果同下行 Del<int> m1 = new Del<int>(WL); Del<int> m3 = delegate(int input) { Console.WriteLine(input); }; //C#2.0方法组转换的新功能,适用于具体委托类型和泛型委托类型 Del<int> m2 = WL; m1(a); m2(b); m3(c); //a.Ext<int>(m1); a.Ext(m1); a.Ext(i => Console.WriteLine(i)); } } }