[英]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.