Action and Func 之間的轉換.

來源:互聯網
上載者:User

為什麼需要這個?

假設你有一個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));

其實還有很多的地方可以通過這種方式來簡化。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.