我很难理解为什么附加一个正常的'作为发布者事件的订阅者的方法,以及代理人。
例如......
public class Caller
{
public string Name { get; set; }
public event EventHandler<RuedaEventArgs> MakeRuedaCall;
public virtual void OnMakeRuedaCall(RuedaEventArgs args) {
if (MakeRuedaCall != null) {
MakeRuedaCall(this, args);
}
}
}
这是我定义和举起活动的发布商类。我也在使用一些自定义事件参数。
public class Salsera {
public Salsera(Caller caller) {
caller.MakeRuedaCall += MakeMovement;
}
public void MakeMovement(object source, RuedaEventArgs args) {
if (args.CallName == "Vacilala") {
Turn();
}
if (args.CallName == "Patin") {
MoveToOutside();
}
}
private void MoveToOutside() {
Console.WriteLine("Ladies move to the outside....");
}
private void Turn() {
Console.WriteLine("Ladies turn....");
}
}
这是一个类,我在构造函数中添加一个方法作为订阅者。
假设我在其他地方......
Caller matt = new Caller();
EventHandler<RuedaEventArgs> anonyMouseFunc = (sender, eventArgs) =>
{
switch (eventArgs.CallName) {
case "Patin":
Console.WriteLine("Adding a new subscriber for Patin");
break;
case "Vacilala":
Console.WriteLine("Adding a new subscriber for Vacilala");
break;
}
};
matt.MakeRuedaCall += anonyMouseFunc;
很抱歉,如果这看起来像一个愚蠢的问题,但为什么你可以订阅一个正常的&#39;方法(假设它与委托签名相匹配)到一个事件,还有一个匿名方法作为事件的委托。
即。 public event EventHandler<RuedaEventArgs> MakeRuedaCall;
如何处理这两个选项?
非常感谢,
答案 0 :(得分:2)
很抱歉,如果这看起来像是一个愚蠢的问题,但为什么你可以订阅一个'正常'方法(假设它与委托签名相匹配)到一个事件,还有一个匿名方法作为一个事件的委托。
在这两种情况下,您都在订阅代理人。在这种情况下:
caller.MakeRuedaCall += MakeMovement;
...您正在使用方法组转换将MakeMovement
(这是规范术语中的方法组)转换为委托实例。该代码(几乎完全)等同于:
caller.MakeRuedaCall += new EventHandler<RuedaEventArgs>(MakeMovement);
或者以另一种方式来思考,它相当于:
EventHandler<RuedaEventArgs> handler = MakeMovement;
caller.MakeRuedaCall += handler;
这种从常规方法创建委托的能力当然不仅仅适用于事件处理 - 您可以将它用于LINQ以及您使用委托的任何其他地方。