你在说什么这里是在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