C# 检查现有的';有线连接';方法

C# 检查现有的';有线连接';方法,c#,events,methods,delegates,C#,Events,Methods,Delegates,我可能在这里误解了一些基本的东西,因为我对这些概念还不熟悉,所以请容忍我 我当前正在从事件中删除方法,如下所示: scheduleView.TouchDown -= scheduleView_TouchDown; 然后在其他情况下-添加以下方法: scheduleView.TouchDown += scheduleView_TouchDown; 到目前为止一切都很好,我可以理解可以添加几种方法,如下所示: scheduleView.TouchDown += scheduleView_Touc

我可能在这里误解了一些基本的东西,因为我对这些概念还不熟悉,所以请容忍我

我当前正在从事件中删除方法,如下所示:

scheduleView.TouchDown -= scheduleView_TouchDown;
然后在其他情况下-添加以下方法:

scheduleView.TouchDown += scheduleView_TouchDown;
到目前为止一切都很好,我可以理解可以添加几种方法,如下所示:

scheduleView.TouchDown += scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_AnotherTouchDownEventHandler;
但是,我以后如何检查与此事件关联的方法呢?

有趣的是,您不能(至少从外部)检查。
事件
只能提供两个访问者-
添加
删除
。CLI规范中定义了其他访问器方法,但它们不在C#或AFAIK中的任何其他地方使用。关键点:我们不能问
事件
订阅了什么(实际上,我们不需要知道)。您所能做的就是:
添加
删除

如果您担心双重订阅,那么请注意,如果您试图取消订阅,但实际上尚未订阅,那么在每一个sane实现下,这都是一个不可操作的操作;这意味着您可以:

// make sure we are subscribed once but **only** once
scheduleView.TouchDown -= scheduleView_TouchDown;
scheduleView.TouchDown += scheduleView_TouchDown;
从引发
事件的代码的角度来看
,您很少需要知道是谁-简单地说:

// note I'm assuming a "field-like event" implementation here; otherwise,
// change this to refer to the backing-field, or the delegate from the
// event-handler-list
var handler = TouchDown;
if(handler != null) handler(this, EventArgs.Empty); // or similar
还有一种方法可以将代理列表拆分为各个订阅者,但很少需要:

var handler = TouchDown;
if(handler != null) {
    foreach(EventHandler subscriber in handler.GetInvocationList()) {
        subscriber(this, EventArgs.Empty);
    }
}
其主要用途是:

  • 当您希望对每个订阅服务器执行异常处理时
  • 当委托返回一个值或更改状态时,您需要根据每个订户处理该值

是:如果您在发布事件的类中,您可以访问委托,并且可以调用
GetInvocationList
方法来获取订阅者列表


否:如果您在班外工作,因为学员不向您公开。您可以使用反射来获取它,但这充其量只是一种黑客行为。

在声明事件的类型中,您可以使用
GetInvocationList()
来找出订阅了哪些委托:

public class EventProvider
{
    public event EventHandler SomeEvent;

    protected virtual void OnSomeEvent(EventArgs args)
    {
        if (SomeEvent != null)
        {
            var delegates = SomeEvent.GetInvocationList();
            foreach (var del in delegates)
            {
                Console.WriteLine("{0} has subscribed to SomeEvent", del.Method.Name);
            }
            SomeEvent(this, args);
        }
    }

    public void RaiseSomeEvent()
    {
        OnSomeEvent(EventArgs.Empty);
    }
}

public class Program
{
    public static void Main()
    {
        EventProvider provider = new EventProvider();
        provider.SomeEvent += Callback1;
        provider.SomeEvent += Callback2;
        provider.RaiseSomeEvent();
    }

    public static void Callback1(object sender, EventArgs e)
    {
        Console.WriteLine("Callback 1!");
    }

    public static void Callback2(object sender, EventArgs e)
    {
        Console.WriteLine("Callback 2!");
    }
}
这将产生以下输出:

Callback1 has subscribed to SomeEvent
Callback2 has subscribed to SomeEvent
Callback 1!
Callback 2!

谢谢你,马克。就目前的情况而言——我的代码是为了避免您推荐的任何重复订阅的可能性而编写的,我的问题更像是好奇。再次感谢。