扩展方法
有时我们没有一个类的源代码,但是又需要在这个类中添加一些需要的方法,如何在不改变类源码的情况下,为类添加一个或多个方法呢?扩展方法就为我们提供了一个思路。
例如,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关键字修饰,第一个参数定义了它扩展的类型
- 如果类中存在实例方法,则优先调用实例方法,如果不存在实例方法,则调用扩展方法
- 当扩展方法在其他程序集中时,需要先添加引用,然后添加命名空间
- 可以让空引用调用扩展方法,但是前提是扩展方法中没有使用传入的实例对象,否则会报空指针错误