扩展方法

  有时我们没有一个类的源代码,但是又需要在这个类中添加一些需要的方法,如何在不改变类源码的情况下,为类添加一个或多个方法呢?扩展方法就为我们提供了一个思路。

  例如,String类中没有ShowInfo()方法。String类是密封的,所以不能从这个类中继承。但是可以创建一个扩展方法。

 1     class Program
 2     {
 3         static void Main(string[] args)
 4         {
 5             string str = "a";
 6             str.ShowInfo();
 7 
 8             Console.ReadKey();
 9         }
10         static void show(object sender, string content)
11         {
12             Console.WriteLine(content);
13         }
14     }
15 
16     static class StringExtension
17     {
18         public static void ShowInfo(this string obj)
19         {
20             Console.WriteLine("为String类型添加的扩展方法!");
21         }
22     }

 

   str.ShowInfo(); 这句代码编译后就相当于 StringExtension.ShowInfo(str); 

  当调用扩展方法ShowInfo()时,会先去找string类中是否存在这个方法,如果存在,则调用string类中的实例方法,如果不存在就去当前程序的扩展方法表里去找。

 

  我们以string类型中的扩展方法Where()为例;其实扩展方法Where()并不是在string类中定义的,而是在Enumerable类中定义的,并在Enumerable类中将Where()这个扩展方法添加到了接口IEnumerable<T>中,又因为string类型实现了接口IEnumerable<T>,所以string就存在了Where()这个扩展方法。

注意:

  • 定义扩展方法的类必须是静态类,扩展方法也必须是静态的
  • 扩展方法第一个参数必须用this关键字修饰,第一个参数定义了它扩展的类型
  • 如果类中存在实例方法,则优先调用实例方法,如果不存在实例方法,则调用扩展方法
  • 当扩展方法在其他程序集中时,需要先添加引用,然后添加命名空间
  • 可以让空引用调用扩展方法,但是前提是扩展方法中没有使用传入的实例对象,否则会报空指针错误
posted @ 2017-06-23 14:01  CS讷于言而敏于行  阅读(223)  评论(0编辑  收藏  举报