什么是扩展方法,在MSDN解释是:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
什么意思呢?我们在给一个DLL扩展功能的时候,可以通过直接修改源代码添加所需要的功能,但是有很多时候我们是无法修改源代码,此时有想实现功能扩展就需要使用扩展方法了
扩展方法的实现其实很简单。需要的条件为:
- 一个静态类
- 静态类中定义一个静态方法,该方法就是我们需要扩展的方法
- 静态方法的第一个参数为需要扩展的类型,并且使用 this 作为前导词
例如:
1 public static class ExternalMethod 2 { 3 public static int ExtIsRange(this int t, int min, int max) 4 { 5 int result = 0; 6 if (t < min) 7 { 8 result = -1; 9 } 10 else if (result > max) 11 { 12 result = 1; 13 } 14 else 15 { 16 result = 0; 17 } 18 return result; 19 } 20 21 public static string ToString(this int t) 22 { 23 return "This is an extension of the method, but never call"; 24 } 25 }
上面就是一个典型的扩展方法例子,该方法定义了一个静态类 ExternalMethod 在该类中定义了两个扩展方法 一个是 ExtIsRange 一个是 ToString ,这两个方法的方法定义中的第一个参数都是 (this int t),就说明这两个方法都是对int类型进行的扩展。
上例中,我们将ToString方法也进行了扩展,大家应该知道,ToString方法在System.Object类型中有定义,并且Int类型也将该方法进行了重写,所有在Int的实例中就有ToString的方法定义,此时我们无论如何调用都不会触发我们的 ToString 扩展方法,这是因为如果扩展类型中有和扩展方法同名的方法,则优先调用类型中定义的方法,而扩展方法就不会被调用。
扩展方法的调用
扩展方法的调用和普通类型实例调用一样
1 public class TestExtMethod 2 { 3 public static void main() 4 { 5 int age = 54; 6 Console.Write(age.ExtIsRange(20, 40)); 7 } 8 }
上例中定义了整型类型 age 之后age调用了刚刚定义的扩展方法 ExtIsRange ,调用方法和其他整型方法调用一样。