C# 擴展方法

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

相關文章
相關標籤/搜索