有没有办法判断是否在自己的调用者中引发了一个事件。基本上我有1.N类,都基本相同,每个都由一个线程运行。我有一个枚举区分基本类型。我在顶级类ExecutionState中有一个委托,它创建所有子类(将它们存储在一个集合中)。我在每节课都有以下内容。 ExecutionState是顶级创建者类,它包含委托和关联事件
public void Subscribe(ExecutionState ExecState)
{
if (this.ExpressionInstance.IsMultiLine)
{
ExecState.MultiMatchEvent += new ExecutionState.MultiMatch(Signal);
}
}
private void Signal(int ProcessorPosition)
{
}
private void SendEvent(ExecutionState.MultiMatch Match)
{
if ((Status & RuleState.HasEnd) == RuleState.HasEnd)
{
Match(CurrentProcessorNumber);
}
}
ExecutionState是顶级创建者类,它包含委托和关联事件:
public delegate void MultiMatch(int ProcessorPosition);
public event MultiMatch MultiMatchEvent;
当我调用SendEvent时,我假设一个事件将在它自己的类中到达Signal。当然,只有当我在ExecutionState中设置的特定条件存在时,才需要调用Subscribe,即在1类中,它不是事件发送者类(按设计)。
我知道过去可能已多次回答过。这是机械地做的情况,也许在事件参数中设置一个标志来定义它来自它自己的类,或者是它们更优雅的方式。
感谢。 鲍勃。
答案 0 :(得分:0)
如果你看看ASP.NET中的事件,你会发现几乎所有的处理程序都有这样的签名:
public delegate EventHandler(object _sender, EventArgs _args);
当然,EventArgs
是某些EventArgs
派生类。 _sender
总是指任何提升事件的对象。
您可以在上面概述的委托签名中或在自定义EventArgs
- esque类中实现类似的东西,其抽象基础可能如下所示:
public abstract class MyEventArgs
{
private object m_Sender = null;
public MyEventArgs(object _sender)
{
m_Sender = _sender;
} // eo ctor
public object Sender { get { return m_Sender; } }
} // eo class MyEventArgs
确保您的所有事件对象都源于此:
public class SomeEventArgs : MyEventArgs { /* ... */ }
然后你会举起你的活动:
if(OnMyEvent != null)
OnMyEvent(new SomeEventArgs(this));
然后,收件人可以进行比较,看看是不是发送了它的人。
答案 1 :(得分:0)
如果查看vanilla EventHandler类的签名,则第一个参数为object sender
。这是.NET框架中的典型模式,它允许您比较引发事件的对象的相等性:
public EventHandler(object sender, EventArgs e)
{
if(this.Equals(sender))
{
//...
}
}
使用您的API的开发人员可以很好地理解这个习惯用法,因此有必要遵循IMO。