合理使用“.NET擴展方法”來簡化代碼(例子:空值判斷,利用擴展方法實現LINQ操作符ForEach)
我們先簡單介紹擴展方法的定義,擴展方法是用來在類型定義完成后再繼續為其添加新的方法。擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。你只要在靜態類的靜態方法的參數前加上this,就可以生成這個類的擴展方法。
如果你曾經開發過詳細資料修改的窗口或者頁面,你一定經常會為空值的判斷而感到煩惱。

這時間你被迫在獲取值之前先去判斷控件的Text值是否為空值,如果為空則輸入默認值,如果非空,則進行輸入值的類型轉換。
User user=new User();
if(tbID.Text!=null&&tbID.Text.Trim()!="")
user.ID=int.Parse(tbID.Text);
else
user.ID=-1;
if(tbName.Text!=null&&tbName.Text.Trim()!="")
user.Name=tbName.Text;
ele
user.Name="暫無";
............
UserManager.Update(user);
過多的if...else...判斷會使代碼變成過于復雜,可讀性差。此時,使用擴展方法可以代替if(判斷式),從而簡化代碼。只要應用此擴展代碼后,以后的空值判斷就可以直接使用一個方法去代替,從而擺脫if...else...的困擾。
這時候,你需要創建一個靜態類Extension,然后在靜態類里面添加一個靜態方法GetString,這時候要把第一個參數設置為this string data,現在你已經成功為string類創建了一個擴展方法了。同樣,你也可以相同方法為string類創建一個擴展方法GetInt。通過這兩個方法你便可以直接在代碼中的string對象直接使用這兩個方法,而不會再受if...else...的困擾。
public static class Extension
{
public static string GetString(this string data )
{
if(data!=null&&data.Trim()!="")
return data;
else
return “暫無”;
}
public static int GetInt(this string data )
{
if(data!=null&&data.Trim()!="")
return int.Parse(data);
else
return -1;
}
}
現在,你可以直接在String類里面直接使用GetString(),GetInt()這兩個擴展方法了
User user=new User();
user.ID=tbID.Text.GetInt();
user.Name=tbName.Text.GetString();
.............
UserManager.Update(user);
如果你對LINQ的結構有了一定的了解,那么你就應該理解LINQ的表達式正是使用IEnumerable或者IEnumerable<T>的擴展方法生成的,多 個LINQ的操作符都可以利用代碼進行擴展,你可以按需要寫下實用性更高的操作符。在介紹LINQ擴展方法前,先介紹一下LINQ里面常用的委托。
delegate void Action<T>(T obj)
delegate TOutput Converter<TInput,TOutput>(TInput input);
delegate Boolean Predicate<T>(T object);
delegate void Func<TResult>();
delegate void Func<T,TResult>();
在介紹如何開發LINQ的自定表達式前,先為大家介紹一下LINQ里面Where操作符的實現方式。
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source ,Func<TSource,Boolean> predicate)
{
foreach(TSource element in source)
{
if(predicate(element))
yield return element;
}
}
這樣每個IEnumerable<T>都可以使用Where操作符,在你對擴展已經有了一定的了解后,你也可以嘗試為LINQ建立更多適用的操作符了。在很多LINQ數據查詢時,你都會用到foreach去對查詢結果進行操作,每次都使用foreach可能令你感到厭煩。
例如:下面是你最常用方法
IEnumerable<Book> books=from x in BookList
select x;
foreach(Book book in books)
{
Console.WriteLine("Book Name is"+book.Name);
Console.WriteLine("Book Author is"+book.Author);
..........
}
現在你可以嘗試用擴展方法為IEnumerable<T>設置一個ForEach表達式
public static void ForEach<T>(this IEnumerable<T> source ,Action<T> func)
{
foreach(var item in source)
func(item);
}
通過一個這樣簡簡單單的擴展方法,你就可以直接在LINQ表達式中實現ForEach
DataBase.Books.Where(x=>x.Price>30)
.ForEach(x=>{
Console.WriteLine(“Book Name is”+x.Name);
Console.WriteLine(“Book Author is" +x.Author);
} );
在LINQ里面,擴展方法隨處可見,深入了解擴展方法,可以讓你按需要而為系統可發更適用的方法,從而簡化代碼,趕快動手,設置一些合適自己使用的擴展方法吧!對.NET開發有興趣的朋友請加入博客園討論小組“.NET高級編程” 一起探討!
對 JAVA 開發有興趣的朋友歡迎加入QQ群:174850571 共同探討!
對 .NET 開發有興趣的朋友歡迎加入QQ群:162338858 共同探討 !
以異步的方式操作TCP/IP套接字——以異步方式實現簡單的聊天室合理使用“.NET擴展方法”來簡化代碼(例子:空值判斷,利用擴展方法實現LINQ操作符ForEach)分部類和分部方法反射的奧妙利用泛型與反射更新實體(ADO.NET Entity Framework)
我們先簡單介紹擴展方法的定義,擴展方法是用來在類型定義完成后再繼續為其添加新的方法。擴展方法使您能夠向現有類型“添加”方法,而無需創建新的派生類型、重新編譯或以其他方式修改原始類型。 擴展方法是一種特殊的靜態方法,但可以像擴展類型上的實例方法一樣進行調用。你只要在靜態類的靜態方法的參數前加上this,就可以生成這個類的擴展方法。
浙公網安備 33010602011771號