你在說什麼這裏是在C#中的事件,例如通常的處理;
public class SomeType {
public event EventHandler SomeEvent;
protected virtual void OnSomeEvent() {
EventHandler handler = SomeEvent;
if(handler!=null) handler(this,EventArgs.Empty);
}
public void SomethingInteresting() {
// blah
OnSomeEvent(); // notify subscribers
// blap
}
// ...
}
隨着用戶...
SomeType obj = new SomeType();
//...
obj.SomeEvent += /* some handler */
//...
處理程序可能是一個方法,但在你的簽名等,再使用具有不匹配的簽名,與現有方法的常用方法的討論匿名方法:
obj.SomeEvent += delegate { this.Text = "Done!"; };
您可以有委託列表:
List<SomeDelegateType> list = new List<SomeDelegateType>();
list.Add(...);
但由於委託實例是組播這可能是多餘的 - 這樣你就可以做到這一點更直接:
Action action = null;
action += delegate { Console.WriteLine("Did A");};
action += delegate { Console.WriteLine("Did B");};
action(); // does both A & B
需要注意的是更爲複雜的委託使用率可能involv傳入的參數值 - 例如:
int i = 24;
Func<int,int,int> func = (x,y) => (x * i) + y;
int result = func(2, 3); // 51
通過將諸如匿名方法(或lambda,如上所述)與諸如捕獲變量之類的東西結合起來,簽名必須匹配的問題很少成爲問題 - 您可以用一個包裝lambda進行簽名匹配(根據需要添加額外的值或刪除參數)。
注意與事件(具體地)常用的方法是保持簽名:
void SomeDelegateType(object sender, SomeArgsType args);
其中SomeArgsType : EventArgs
- 或使用EventHandler<T>
這會爲你做到這一點。
您是否熟悉C#的「events」概念?我認爲這將完成你想要的東西,而且它是本地語言。 :) http://msdn.microsoft.com/en-us/library/aa645739(VS.71).aspx – Sapph 2010-01-17 09:25:28
同意上面Sapph的評論。查看構建自EventArgs派生的自定義類,以便將不同類型的數據從發件人傳輸到接收方(如示例代碼中所示):http://msdn.microsoft.com/en-us/library/system.eventargs(VS .85).aspx – BillW 2010-01-17 09:39:44
也想一想:http://msdn.microsoft.com/en-us/library/w369ty8x.aspx「如何發佈事件」是一篇非常有用的文章,向您展示了使用定義事件的通用和非通用方法。 – BillW 2010-01-17 10:31:18