簡體   English   中英

將方法附加到C#中的事件時如何傳遞參數

[英]how do I pass parameters when attaching a method to an event in c#

我想參數發送到這是由一個事件附加事件偵聽器時調用的方法,我可以創造一個正常工作的匿名方法的參數,但是我會在理想情況下一樣,使其更加簡潔,如下面的例子中,這是拋出以下編譯器錯誤:

運算符'+ ='不能應用於類型'System.EventHandler'和'void'的操作數

ConfigFileWritten += (sender, args) =>
{
    string prefix = "IFMDE";
    bool enabled = true;

    SetConfigInterfaceEnabled(prefix, enabled);
};

//this line is throwing a compiler error 
ConfigFileWritten += SetConfigInterfaceEnabled("",true);

是否有可能refacor中的代碼,我的建議?

不是這樣的。 您正在執行的操作試圖將調用 SetConfigInterfaceEnabled 的結果附加為事件處理程序,這當然是不可能的(結果必須是EventHandler委托,但這只是void )。

你能做的是

ConfigFileWritten += (s, e) => SetConfigInterfaceEnabled("",true);

在這里,事件處理程序是具有適當簽名(帶有兩個隱式類型的參數)的lambda函數,該簽名進而調用SetConfigInterfaceEnabled 其唯一目的是使SetConfigInterfaceEnabled的簽名適應預期的EventHandler

為了完整起見,我應該提到,盡管這樣做很不常見,但是如果SetConfigInterfaceEnabled是創建委托的工廠方法,則可以采用您建議的語法:

EventHandler SetConfigInterfaceEnabledDelegate(string s, bool b)
{
    return (o, e) => SetConfigInterfaceEnabled(s, b);
}

ConfigFileWritten += SetConfigInterfaceEnabledDelegate("", true);

通過不為按值傳遞的參數使用變量,可以使其更加簡潔,如下所示:

ConfigFileWritten += (sender, args) => {
    SetConfigInterfaceEnabled("IFMDE", true);
};

當編譯器看到以上內容時,它不會立即調用SetConfigInterfaceEnabled 而是,它創建一個可以在運行時調用的對象,這樣,當您調用它時,就會調用SetConfigInterfaceEnabled 換句話說, =>創建一個委托,使您可以推遲對SetConfigInterfaceEnabled的調用。

但是,當編譯器看到此內容時

ConfigFileWritten += SetConfigInterfaceEnabled("IFMDE", true);

它將其解釋為立即調用SetConfigInterfaceEnabled的指令,並將從其返回的委托用作事件處理程序。 當然這是不可能的,因為SetConfigInterfaceEnabled不會返回委托。

如果ConfigFileWritten事件處理程序為您自己的類型,則在發生事件時可以傳遞argumemns。 EventArgs派生您自己的事件參數類型並傳遞參數。 它可以為您提供更大的靈活性,並且您不必在事件處理程序中對參數進行硬編碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM