MSDN中的定义是:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this修饰符为前缀。
有点难懂,还是通过例子了解它吧
通过扩展方法,我们可以为一些.NET内置对象添加方法了,下面是为string添加一个SayHello方法
using System;namespace 扩展方法 { class Program { static void Main(string[] args) { string str = null; str.SayHello(); string str1 = "not hello"; str1.SayHello(); Console.ReadKey(); } } public static class Extension // 必须是一个静态类 { public static void SayHello(this string str) //必须为public static 类型,且参数使用this关键字 { if (str == null) { Console.WriteLine("Hello"); } else Console.WriteLine("{0}", str); } } }
这样的话在同一个命名空间下的所有string都可以使用SayHello方法了,重申一下代码注释中的重要要求
首先声明扩展方法的类必须是static类,并且方法也要是static类型,扩展方法必须包含this关键字作为它的第一个参数类型,并且后面跟着它所扩展的类的名称
同样也可以为自定义对象添加扩展方法,为MyClass添加了一个getAvg方法
using System; namespace 扩展方法 { class Program { static void Main(string[] args) { MyClass mc = new MyClass(3,4); Console.WriteLine("avg is {0}", mc.getAvg()); Console.ReadKey(); } } class MyClass { private double width, height; public MyClass(double val1, double val2) { width = val1; height = val2; } public double getSum() { return width + height; } } static class ExtendMyClass { public static double getAvg(this MyClass mc) { return mc.getSum() / 2; } } }
还可以为泛型类添加扩展方法,规则跟非泛型十分类似
using System; using System.Collections.Generic; namespace 扩展方法 { class Program { static void Main(string[] args) { MyClass<int> mc = new MyClass<int>(6); mc.Print(); Console.ReadKey(); } } class MyClass<T> { private T data; public MyClass(T val) { data = val; } public T getData() { return data; } } static class ExtendMyClass { public static void Print(this MyClass<int> mc) { Console.WriteLine("Data is {0}",mc.getData()); } } }