有許多擴展類的方式。若是有類的源代碼,繼承就是給對象添加功能的好方法。可是若是沒有源代碼,該腫麼辦呢?此時能夠使用擴展方法,它容許改變一個類,但不須要該類的源代碼。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; } } }