為什麼需要這個?
假設你有一個WebService 的Proxy, 有方法:
public class Proxy : IProxy{ public void Foo(int i, bool b) { // do something. } public string Bar(string str) { return "Something"; }}
你可以這樣調用:
Proxy p = new Proxy(); p.Foo(0, true); string s = p.Bar("hello");
但是你需要處理一系列的Exception, 例如:
string CallBar(string str){ try { return proxy.Bar(str); } catch (EndpointNotFoundException ee) { // handle it. } catch (TimeoutException te) { // handle it. } catch (CommunicationException ce) { // handle it. } catch (Exception e) { // handle it. } return null;}
如果有很多地方需要調用這個Proxy 的方法,你希望重複這一大段代碼嗎?當然不希望。於是我們對它進行封裝:
public T CallProxy<T>(Func<Proxy, T> func){ try { return func(proxy); } catch { // skip all exception handling code. } return default(T);}
這樣,我們調用 proxy.Bar(“hello”):
string str = CallProxy(proxy => proxy.Bar("Hello"));
對Foo 怎麼處理? 需要定義另一個CallProxy:
public void CallProxy(Action<Proxy> action) { // do something here: }
我不想寫重複代碼,如果有一個轉換函式把Action 轉化成Func:
public static class Extension{ public static Func<T, object> ToFunc<T>(this Action<T> action) { return t => { action(t); return null; }; } }
上面的CallProxy 就可以簡單的實現為:
public void CallProxy(Action<Proxy> action){ CallProxy(action.ToFunc());}
CallProxy(proxy => proxy.Foo(0, true));
其實還有很多的地方可以通過這種方式來簡化。