如何判断生成的事件是否由其自己的类发送

时间:2011-02-21 23:58:04

标签: c#-4.0

有没有办法判断是否在自己的调用者中引发了一个事件。基本上我有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类中,它不是事件发送者类(按设计)。

我知道过去可能已多次回答过。这是机械地做的情况,也许在事件参数中设置一个标志来定义它来自它自己的类,或者是它们更优雅的方式。

感谢。 鲍勃。

2 个答案:

答案 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。