Linq学习总结(2)——扩展方法
扩展方法使您能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
我们来为String类型定义一个简单的扩展方法:
public static class Extensions
{
public static void SayHello(this String name)
{
Console.WriteLine("Hello {0}",name);
}
}
之后,我们可以在main函数中这样使用扩展方法:
static void Main(string[] args)
{
String s = "Wade";
s.SayHello();
}
这样看起来就像是String类型中直接定义好的方法一样,而且还能被智能感知到:
我们注意这个方法名前有个向下的箭头,表示这是一个扩展方法的意思。
但是我们需要认识到这个扩展方法并非真的是String的实例方法,它只是一个静态方法而已,所以我们将上面代码中的s设置为null时调用SayHello()方法,不会报空引用的错误。
注意事项
- 扩展方法是静态类中的静态方法;
- 扩展方法的第一个参数的类型之前必需使用this修饰符,this指代被扩展的类;
- 扩展方法的优先级比常规方法要低,如果某个类拥有一个同名方法的话,那么调用的将是实例方法;
- 扩展方法隐式使用ExtensionAttribute;
- 扩展方法不仅可以“扩展”基本类型和自定义复合类型,还可以扩展接口和委托。
interface IMyInterface
{
void MethodA();
}
static class Extensions
{
public static void MethodB(this IMyInterface myInterface)
{
Console.WriteLine("this is Extension MethodB");
}
}
class classA :IMyInterface
{
public void MethodA()
{
Console.WriteLine("This is classA MethodA");
}
}
class classB : IMyInterface
{
public void MethodA()
{
Console.WriteLine("This is classB MethodA");
}
}
class Program
{
static void Main(string[] args)
{
classA A = new classA();
classB B = new classB();
A.MethodA();
A.MethodB();
B.MethodA();
B.MethodB();
}
/*Output:
* This is classA MethodA
* this is Extension MethodB
* This is classB MethodA
* this is Extension MethodB
*/
}
泛型扩展方法
当扩展方法与泛型结合在一起时,就变得非常强大了。下面我们来看下例子:
static class Extensions
{
//首先我们为实现了IList接口的集合泛型类型添加了一个扩展方法
public static IList<TSource> MyFind<TSource>(this IList<TSource> list, Func<TSource, bool> fun)
{
List<TSource> resultList = new List<TSource>();
foreach (TSource item in list)
{
if (fun(item))
{
resultList.Add(item);
}
}
return resultList;
}
}
class Program
{
static void Main(string[] args)
{
IList<int> numList = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
//然后调用自己定义的扩展方法,是不是有点Linq方法的感觉
IList<int> resultList = numList.MyFind(n => n % 2 == 0);
foreach (var item in resultList)
{
Console.WriteLine(item);
}
/*Output
* 2
* 4
* 6
* 8
*/
}
}
我们可以利用Reflector这样的工具,查看下System.Linq命名空间,就像我们看见的那样,Linq其实就是一大堆扩展方法(还有泛型的)组成。
园内有人对扩展方法“扩展”了很多功能,有兴趣的人可以看看:(本人也做个MARK^_^)
http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html