c#擴展方法的理解

擴展方法是靜態方法,是類的一部分,但是實際上沒有放在類的源代碼中。

擴展方法所在的類也必須被聲明爲static

C#只支持擴展方法,不支持擴展屬性、擴展事件等。

擴展方法的第一個參數是要擴展的類型,放在this關鍵字的後面,告訴編譯期這個方法是Money類型的一部分。

在擴展方法中,可以訪問擴展類型的所有公共方法和屬性。

 

“擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。”

這是msdn上說的,也就是你可以對String,Int,DataRow,DataTable等這些類型的基礎上增加一個或多個方法,使用時不需要去修改或編譯類型本身的代碼。

1.擴展類

class Program
    {
        static void Main(string[] args)
        {
            Money cash = new Money();
            cash.Amount = 40M;
            cash.AddToAmount(10M);
            Console.WriteLine("cash.ToString() returns: " + cash.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;
        }
    }

2.擴展接口

namespace ExtensionInterfaceMethod
{
    class Program
    {
        static void Main(string[] args)
        {
            //使用接口變量來調用擴展方法
            IBasicInterface bii = new BasicImplement();
            bii.SubStract(9, 3);            
        }
    }
    //先創建一個簡單的接口
    public interface IBasicInterface
    {
        int Add(int x, int y);
    }
    //創建一個實現該接口的類
    public class BasicImplement : IBasicInterface
    {
        #region IBasicInterface 成員
        public int Add(int x, int y)
        {
            return x + y;
        }
        #endregion
    }
}

 

如果想要爲該接口IBasicInterface增加一個相減的Subtract方法,在擴展方法中新定義一個Subtract方法。

namespace ExtensionInterfaceMethod
{
    public static class ExtensionMethodClass
    {
        public static int SubStract(this IBasicInterface basicinterface, int x,int y);
    }
}

因爲是接口擴展方法,所以不打算爲這個擴展方法提供任何代碼實現。

編譯時運行報錯,解決方法,在接口擴展方法中實現代碼。

namespace ExtensionInterfaceMethod
{
    public static class ExtensionMethodClass
    {
        public static int SubStract(this IBasicInterface basicinterface, int x, int y)
        {
            //儘管是擴展一個接口,但是還是必須添加對方法的實現
            return x - y;
        }
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章