今天我們接著看一下.NET 3.x的新特性:擴充方法。這裡需要說明的是我所說的.NET 3.x的新特性,其實是C# 3.0的一些新特性,考慮到LinQ等我就把這些特性叫做.NET 3.x新特性。可能這樣叫會有些歧義,但是我還是覺的這樣還好,閑話不多說讓我們進入正題。我覺得在C#3.0中引入自動化屬性等就已經減少了我們不少負擔,而擴充方法是我最喜歡的,它提供的可視化提示中顯得更為巧妙。但是我也會覺得有點煩瑣,當一個類的擴充方法太多時,就像有LinQ存在的情況下,會出現一大批的提示方法......
什麼是擴充方法?他的文法又是怎麼樣的?讓我們來看看。擴充方法必須定義在靜態函數中,擴充的方法也必須是靜態函數。這對於一些方法類的擴充提供了良好的支援,特別是對介面的補充更是極品啊,通常我們在用DataReader取對象時都需要一個轉換,而通過dr(DataReader執行個體)的一些方法如:GetString(int),GetInt32(ing)...其中的參數都是列的索引,通常我們都需要填寫列的名稱,這樣我們就可以對IDataReader介面進行擴充:
1. interface definition:
namespace AttributeSpace
{
public interface IInterfaceDemo
{
public void show();
}
}
2.Extension class definition:
namespace AttributeSpace
{
public static class MyExtension
{
public static bool IsMatchEmail(this string s)
{
public static string DecorateText( this IInterfaceDemo objInterface ,string text)
{
text = text + " decoration!";
return text;
}
}
}
3. class that implement the interface
namespace AttributeSpace
{
public class ClassForInterface : IInterfaceDemo
{
}
}
4. test the extension method:
namespace AttributeSpace
{
class Program
{
static void Main(string[] args)
{
ClassForInterface inter = new ClassForInterface();
string text = inter.DecorateText("廖常煌");
Console.WriteLine("my new name is {0}", text);
Console.Read();
}
}
}
從上面我們也可以知道他的文法,首先要有一個靜態類MyExtensions,對IInterfaceDemo介面的擴充,需要加入this IInterfaceDemo,而參數就是列名text。下面我們來看看他在VS中是怎麼智能提示的呢?
在上面我們可以看到在inter對象中出現了上面擴充的提示(extension),原來IInterfaceDemo內建的只有一個show()方法,現在看到了另外一個方法DecorateText,這樣是不是感覺上好一點?注意:如果你要用此擴充必須引入所在的命名空間。
在擴充方法中有一種繼承作用,如果當你在父擴充方法類(如上面的IInterfaceDemo)上添加擴充方法後,則他的子類也同樣具有此擴充。如果我們想在所有類中都有的方法我們就可以對Object進行擴充,那樣在所有類中都會具有此擴充的方法,只要你引用了他所做的空間。例如:我們如果要判斷當前執行個體是否為集合或列表中的一個項,我們就可以對Object進行擴充,代碼如下:
我們可以在所有的對象中得到此擴充,可以參考:
我們知道其實整個LinQ都是方法的擴充,這個我們把它留到以後研究他時再說,因為LinQ有三大部分,一個是相對於類的,一個是To SQL的,還有一個是To XML的。當年都把他們叫做LinQ,DLinQ,XLinQ現在好像沒有這麼個教法,我們就順從微軟的意願吧。