擴展方法是靜態方法,是類的一部分,但是實際上沒有放在類的源代碼中。
擴展方法所在的類也必須被聲明爲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;
}
}
}