关于C#扩展方法介绍

来源:互联网 发布:linux gtk安装 编辑:程序博客网 时间:2024/06/13 11:46

扩展方法 Extension Method.

这个可以用在,比方有一个密封类,你不能修改它,但你又想对它继承或者扩展,这个时候就可以用到扩展方法了。

举个例子:

Csharp代码  收藏代码
  1. class Program  
  2. {  
  3.     static void Main(string[] args)  
  4.     {  
  5.         SealedClass x = new SealedClass();  
  6.         Console.WriteLine(x.TestMethod());  
  7.     }  
  8. }  
  9.   
  10. sealed class SealedClass  
  11. {   
  12.   
  13. }  
  14.   
  15. static class SealedClassExtension  
  16. {  
  17.     public static string TestMethod(this SealedClass x)  
  18.     {  
  19.         return "";  
  20.     }  
  21. }  

在上面的例子中,可以看出,要定义方法,需要做以下几件事:

(1) 定义个扩展类;这个类必须是静态类,static的

(2) 定义扩展方法;这个方法也必须是静态的

(3) 该扩展方法的语法比较奇怪,第一个参数是被扩展的类,而且前边必须用个this关键字

下面再举一个例子。

我们经常使用到执行了IEnumerable<T>的容器,比如说List<T>。这些容器因为执行了IEnumerable<T>接口,所以都能使用一些方法,比如Aggregate。

如果去看IEnumerable<T>接口的定义,并没有包含Aggregate方法,所以Aggregate实际是一个扩展方法。

它是在静态类Enumerable中定义的。下面看一下,当然没有完全列出Enumerable类中所有的成员。

Csharp代码  收藏代码
  1. public static class Enumerable  
  2. {  
  3.     public static TSource Aggregate<TSource>(this IEnumerable<TSource> source, Func<TSource, TSource, TSource> func);  
  4.     public static TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func);  
  5.     public static TResult Aggregate<TSource, TAccumulate, TResult>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func, Func<TAccumulate, TResult> resultSelector);  
  6. }  

上面实际的例子中可以看出,不仅可以对类进行扩展,对接口也可以进行扩展。