扩展方法是C# 4.0的又一个特性,它允许开发人员在不创建派生类型和不修改原始类型的基础上,直接向现有类型"添加"方法。扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用。
包含扩展方法的类必须定义为静态(static)类,扩展方法也必须定义为静态(static)方法,它的第一个参数指定该方法被扩展到哪一个类型中,同时第一个参数要用this关键字修饰,扩展方法可以作为普通方法一样的方式被调用。
示例代码4-16演示扩展方法的使用。包含扩展方法的类ExtendMethods被定义为static类,扩展方法:IsRight()、PrintHint()都被定义为static方法,而且第一个参数都用this关键字修饰,表示该方法扩展到某个类型。其中,IsRight()方法被扩展到string和int类型,而PrintHint()方法则被扩展到object类型,这样,PrintHint()就可以被所有类型访问,因为所有类型都是object类型的子类。
示例代码4-16
public static class ExtendMethods { // 定义string类型的扩展方法IsRight() public static bool IsRight( this string str) { switch (str.ToUpper( ).Trim( )) { case " RIGHT " : return true ; case " YES " : return true ; case " OK " : return true ; default : return false ; } } // 定义一个int类型的扩展方法IsRight() public static bool IsRight( this int val) { if (val > 10 ) { return true ; } else { return false ; } } // 定义一个对于所有类型的扩展方法,打印类信息同时添加一个字符串作为提示信息 public static void PrintHint( this object obj, string hint) { System.Console.WriteLine(obj.ToString( ) + " -- " + hint); } } namespace UseExtMethod { // 必须显式声明使用ExtendMethods命名空间 using ExtendMethods; class Program { static void Main( string [] args) { // 使用string类的扩展方法IsRight() string str1 = " right " , str2 = " err " ; System.Console.WriteLine( " str1.IsRight() = " + str1.IsRight( ). ToString()); System.Console.WriteLine( " str2.IsRight() = " + str2.IsRight( ). ToString( )); // 使用int类型的扩展方法IsRight() int i1 = 11 , i2 = 5 ; System.Console.WriteLine( " i1.IsRight() = " + i1.IsRight( ). ToString( )); System.Console.WriteLine( " i2.IsRight() = " + i2.IsRight( ). ToString( )); // 使用Object类型的扩展方法PrintHint() string str3 = " 誓言 " ; str3.PrintHint( " 你好! " ); } } }
生成并运行示例代码4-16,得到程序输出如下:
str1.IsRight() = True str2.IsRight() = False i1.IsRight() = True i2.IsRight() = False 誓言-- 你好!
在使用扩展方法前需要显式引用扩展方法所在的命名空间,如示例代码4-16中的代码 "using ExtendMethods;"。另外,在扩展方法被调用时和普通的成员方法调用一样,扩展方法的第一个参数也需要在调用时指出。