C#扩展方法应用之 try catch finally 封装
? ? ? 本文將介紹如何利用擴展方法將?try catch finally 語句塊簡化成如下的調用形式:
public void Test1(){Employee emp = new Employee();emp.Try(p => p.Work()).Catch(e => HandleException(e)).Finally(p => p.Rest());}? ? ? 雖然這樣做似乎節省不了太多代碼,但看起來更工整一點。下面介紹如何實現:
?
? ? ? 一. try
public class TryUnit<T> where T : class{public TryUnit(T obj, Action<T> action){this.Obj = obj;this.Action = action;}public T Obj { get; private set; }public Action<T> Action { get; private set; }}public static TryUnit<T> Try<T>(this T obj, Action<T> action) where T : class{return new TryUnit<T>(obj, action);}?
? ? ? 首先定義一個TryUnit泛型類,用來存儲try的調用對象和想調用的方法,然后為對象擴展一個Try方法,返回一個TryUnit對象。
?
? ? ? 二. catch
public class CatchUnit<T> where T : class{public CatchUnit(TryUnit<T> tryUnit, Action<Exception> exAction){this.Obj = tryUnit.Obj;this.Action = tryUnit.Action;this.ExAction = exAction;}public T Obj { get; private set; }public Action<T> Action { get; private set; }public Action<Exception> ExAction { get; private set; }}public static CatchUnit<T> Catch<T>(this TryUnit<T> tryUnit, Action<Exception> exAction) where T : class{return new CatchUnit<T>(tryUnit, exAction);}?
? ? ? 與try的做法類似,再定義一個CatchUnit類,它比TryUnit多出一個對異常處理的Action;然后為TryUnit對象擴展一個Catch方法,返回一個CatchUnit對象。也就是說,在對象調用了Try方法返回TryUnit之后,才可以繼續調用Catch方法,必須按順序調用。Try和Catch實際上都是在傳遞參數,方法的執行將會延遲到Finally中。
?
? ? ? 三. finally
public static void Finally<T>(this TryUnit<T> tryUnit) where T : class{try{tryUnit.Action(tryUnit.Obj);}finally{}}public static void Finally<T>(this CatchUnit<T> catchUnit) where T : class{try{catchUnit.Action(catchUnit.Obj);}catch (Exception e){catchUnit.ExAction(e);}finally{}}public static void Finally<T>(this TryUnit<T> tryUnit, Action<T> action) where T : class{try{tryUnit.Action(tryUnit.Obj);}finally{action(tryUnit.Obj);}}public static void Finally<T>(this CatchUnit<T> catchUnit, Action<T> action) where T : class{try{catchUnit.Action(catchUnit.Obj);}catch (Exception e){catchUnit.ExAction(e);}finally{action(catchUnit.Obj);}}?
? ? ? Finally方法根據是否包括異常處理塊,finally塊中是否執行操作可派生出4個重載版本。完整的 try catch finally 組合方法是對CatchUnit的擴展方法,在調用Catch方法返回CatchUnit對象時調用;如果沒有異常處理塊,則直接從try方法的返回類型TryUnit上擴展出只有?try?finally 的組合方法。即使finally塊中不做任何處理,也需要調用Finally方法,因為所有處理都被延遲到了Finally中調用。
?
? ? ? 好了,代碼就介紹到這里,這是本人在博客園的第一篇文章,有寫的不好的地方望大家原諒,并歡迎提出意見,O(∩_∩)O謝謝。
?
轉載于:https://www.cnblogs.com/enterframe/p/4164758.html
總結
以上是生活随笔為你收集整理的C#扩展方法应用之 try catch finally 封装的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC4验证用户登录特性实现方法
- 下一篇: (软件工程复习核心重点)第六章实现和测试