定义:扩展方法允许现存已编译的类型和当前即将被编译的类型在不需要被直接更新的情况下,获得功能上的扩展。
为类型添加功能但并不拥有类型的已有代码时;
当需要使类型支持一系列成员但不能改动类型的原始定义时。
说明:扩展方法不会真正改变编译后的代码,只是在当前应用程序的上下文中为类型增加成员
一、扩展方法定义
static class MyExtensions // ①方法定义在静态类 { // ②扩展方法声明为静态的 public static void DisplayDefiningAssembly (this object obj) // ③使用this关键字对第一个参数修饰 { Console.WriteLine("{0} lives here:=> {1} ",obj.GetType().Name,Assembly.GetAssembly(obj.GetType()).GetName().Name); } public static int ReverseDigits(this int i) { // 把int翻译为string然后获取所有字符 char[] digits = i.ToString().ToCharArray(); // 现在反转数组中的项 Array.Reverse(digits ); // 放回string String newDigits = new string (digits ); // 最后以int返回修改后的字符串 return int.Parse(newDigits) } }
1)必须把方法定义在静态类中
2)每个扩展方法也必须是静态的
3)所有扩展方法都需要使用this关键字对第一个参数进行修饰(只对第一个参数)
4)每个扩展方法只能被内存中正确的实例调用,或通过其所处的静态类被调用
二、使用扩展方法
1)在实例层次上调用扩展方法
int myInt =123456; myInt.DisplayDefiningAssembly(); ... //使用其他类型的实例调用扩展方法
2)静态调用扩展方法
int myInt =123456; MyExtensions.DisplayDefiningAssembly(myInt);
说明:
①、扩展方法本质上是可以从扩展类型的实例上进行调用的静态方法;只是一种语法糖
②、它和普通的方法不一样,扩展方法不能直接访问它们扩展的类型成员。扩展不是继承
③、但是我们可以使用this限定的参数来访问要扩展类型的所有公共成员(仅仅是公共成员)
④、只有对正确导入了扩展方法所在命名空间,才可以使用扩展方法
⑤、扩展方法支持智能感应,以一个向下的箭头代指扩展方法
三、通过扩展方法扩展接口类型
需要对扩展的接口的扩展方法做实现定义
static class MyExtensions { // 扩展IBase 方法及其实现 public static int Sub(this IBase b, int x,int y) { return x-y; } }