程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> C# 中如何利用lambda實現委托事件的掛接

C# 中如何利用lambda實現委托事件的掛接

編輯:更多關於編程
    在寫一個小程序的時候,碰到了這樣的問題,需要用委托來掛接事件,但是又想在這事件中使用局部的變量,而委托一旦定義好後,掛接方就沒有辦法再添加額外的形參了。那有沒有什麼辦法,可以實現呢  

    委托定義如下:

    復制代碼 代碼如下:
    public class SocketSp
    {
     public delegate void ReceiveCompleted(byte[] receiveBuffer, int receiveTotalLen,Exception ex);
     public ReceiveCompleted receiveCompleted;
    }


    掛接方定義如下

    復制代碼 代碼如下:
    public class LinkOuter
    {
     SocketSp linkOuterSocket = new SocketSp();


           private void test(Socket requestHandleSocket)
          {
               //此處要掛接  linkOuterSocket.receiveCompleted 事件,同時想將參數requestHandleSocket傳入,以便後續處理。
          }
    }


    第一個想法是利用delegate,但是失敗了。因為雖然掛接上去了,委托傳進的參數丟了,無法進行後續操作。

    復制代碼 代碼如下:
    private void test(Socket requestHandleSocket)
    {
    linkOuterSocket.receiveCompleted += delegate {
    //To do
    };
    }


    第二個想法是利用Action,結果也失敗了。IDE提示委托Action未采用3個參數。

    復制代碼 代碼如下:
    private void test(Socket requestHandleSocket)
    {
    linkOuterSocket.receiveCompleted += (Action)((outerReceiveBuffer, totalLen, ex) => {
    //To do
    });
    }


    第三個想法是利用lambda表達式,先與委托掛接,同時利用局部變量的調用,來實現參數傳遞到sendResponse函數中,以便後續操作。

    復制代碼 代碼如下:
    private void test(Socket requestHandleSocket)
    {
    linkOuterSocket.receiveCompleted += new SocketSp.ReceiveCompleted((outerReceiveBuffer,totalLen,ex) =>
    {
    byte[] realOuterReceiveBuffer = new byte[totalLen];
    Array.Copy(outerReceiveBuffer, 0, realOuterReceiveBuffer, 0, totalLen);
    sendResponse(requestHandleSocket, realOuterReceiveBuffer,"200 OK", "text/html");
    });
    }


    最終用lambda表達式實現了。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved