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