有许多扩展类的方式。若是有类的源代码,继承就是给对象添加功能的好方法。可是若是没有源代码,该肿么办呢?此时能够使用扩展方法,它容许改变一个类,但不须要该类的源代码。ide
扩展方法是静态方法,它是类的一部分,但实际上没有放在类的源代码中。假定下面Demo中的Money类须要一个方法AddToAmount(decimal amountToAdd)。可是,因为某种缘由,程序集最初的源代码不能直接修改。此时必须作的工做就是建立一个静态类,把方法AddToAmount()添加为一个静态方法。this
public static class MoneyExtension { public static void AddToAmount(this Money money, decimal amountToAdd) { money.Amount += amountToAdd; } }
注意AddToAmount()方法的参数。对于扩展方法,第一个参数是要扩展的类型,它放在this关键字的后面。这告诉编译器,这个方法是Money类型的一部分。在这个Demo中,Money是要扩展的类型。在扩展方法中,能够访问所扩展类型的全部公有方法和属性。spa
在主程序中,AddToAmount()方法看起来像是另外一个方法。它没有显示第一个参数,也不能对它进行任何处理。要使用新方法,须要执行以下调用,这与其余方法相同:code
cash1.AddToAmount(10M);
即便扩展方法是静态的,也要使用标准的实例方法语法。注意这里使用cash1是咧变量来调用AddToAmount,而没有使用类型名。对象
若是扩展方法与类中的某个方法同名,就历来不会调用扩展方法。类中已有的任何实例方法优先。blog
完整Demo以下:继承
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 扩展方法 { class Program { static void Main(string[] args) { Money cash1 = new Money(); cash1.Amount = 40M; Console.WriteLine("cash1.ToSting() returns:" + cash1.ToString()); cash1.AddToAmount(10M); Console.WriteLine("MoneyExtension function:" + cash1.ToString()); Console.ReadLine(); } } public class Money { private decimal amount; public decimal Amount { get { return amount; } set { amount = value; } } public override string ToString() { return "$" + Amount.ToString(); } } public static class MoneyExtension { public static void AddToAmount(this Money money, decimal amountToAdd) { money.Amount += amountToAdd; } } }