C#扩展方法
有许多扩展类的方式,如果有类的源代码,继承就是给对象添加功能的好方法,但如果没有源代码,该怎么办?此时可以使用扩展方法,它允许改变一个类,但不需要该类的源代码。
扩展方法是静态方法,它是类的一部分,但实际上没有放在类的源代码中,假如有一个Money类如下所示:
View Code
1 public class Money 2 { 3 private decimal amount; 4 /// <summary> 5 /// 金额 6 /// </summary> 7 public decimal Amount 8 { 9 get { return amount; } 10 set { amount = value; } 11 } 12 /// <summary> 13 /// 重写ToString()方法 14 /// </summary> 15 /// <returns></returns> 16 public override string ToString() 17 { 18 return "$" + Amount.ToString(); 19 } 20 }
需要一个方法AddToAmount(decimal cash).但是由于某种原因,程序集最初的源代码不能直接修改。此时我们可以创建一个静态类,把方法AddToAmount(decimal cash)添加为一个静态方法。对应的代码如下:
View Code
1 public static class ExpandMoney 2 { 3 /// <summary> 4 /// 扩展Money 5 /// </summary> 6 /// <param name="money">Money类实例</param> 7 /// <param name="cash">金额</param> 8 public static void AddToAmount(this Money money,decimal cash) 9 { 10 money.Amount += cash; 11 } 12 13 }
注意AddToAmount()方法的参数。对于扩展方法,第一个参数是要扩展的类型,它放在this关键字的后面。这告诉编译器,这个方法是Money类型的一部分。在这个例子中。Money是要扩展的类型,在扩展方法中,可以访问扩展类型的所有公有方法和属性。调用过程如下:
View Code
1 Money money = new Money(); 2 money.Amount = 23; 3 money.AddToAmount(56); 4 5 Console.WriteLine(money.Amount);//输出79 6 Console.ReadKey();
这里即使扩展方法是静态的,也要使用类的实例来调用,而不是类型名。如果扩展方法与类中的某个方法同名,就从来不会调用扩展方法。类中已有的任何实例方法优先。添加扩展方法ToString()如下:
View Code
1 public static class ExpandMoney 2 { 3 /// <summary> 4 /// 扩展Money 5 /// </summary> 6 /// <param name="money">Money类实例</param> 7 /// <param name="cash">金额</param> 8 public static void AddToAmount(this Money money,decimal cash) 9 { 10 money.Amount += cash; 11 } 12 /// <summary> 13 /// 添加ToString()方法 14 /// </summary> 15 /// <param name="money"></param> 16 /// <returns></returns> 17 public static string ToString(this Money money) 18 { 19 return "¥" + money.ToString(); 20 } 21 }
运行如下代码:
View Code
1 Money money = new Money(); 2 money.Amount = 23; 3 4 money.AddToAmount(56); 5 Console.WriteLine(money.Amount);//输出79 6 Console.WriteLine(money.ToString());//输出$79 7 8 Console.ReadKey();
本文摘自C#高级程序设计(第七版)


浙公网安备 33010602011771号