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#高级程序设计(第七版)

 

 

posted @ 2013-01-04 13:18  抬头仰望属于我的天空  阅读(487)  评论(0)    收藏  举报