C# 4.0 如何判断生成的事件是否由它发送';我们自己的班级
是否有一种方法可以判断事件是否在其自己的调用者中引发。基本上我有1.N个类,基本上都是一样的,每个类都由一个线程运行。我有一个区分基本类型的枚举。我在顶级类ExecutionState中有一个委托,它创建所有子类(将它们存储在集合中)。我每节课都有以下内容。ExecutionState是顶级creator类,其中包含委托和关联的事件C# 4.0 如何判断生成的事件是否由它发送';我们自己的班级,c#-4.0,C# 4.0,是否有一种方法可以判断事件是否在其自己的调用者中引发。基本上我有1.N个类,基本上都是一样的,每个类都由一个线程运行。我有一个区分基本类型的枚举。我在顶级类ExecutionState中有一个委托,它创建所有子类(将它们存储在集合中)。我每节课都有以下内容。ExecutionState是顶级creator类,其中包含委托和关联的事件 public void Subscribe(ExecutionState ExecState) { if (this.Express
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类中,而不是事件发送者类(根据设计)
我知道这可能在过去被回答过很多次。这是一种机械的做法,也许在事件参数中设置一个标志来定义它来自它自己的类,或者是一种更优雅的做法
谢谢。
Bob。如果您查看ASP.NET中的事件,您会发现几乎所有处理程序都有如下签名:
public delegate EventHandler(object _sender, EventArgs _args);
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
当然,EventArgs
是一些EventArgs
派生的类\u sender
始终引用引发事件的任何对象
您可以在上面概述的委托签名中,或者在自定义的EventArgs
-esque类中实现类似的功能,其抽象基可能如下所示:
public delegate EventHandler(object _sender, EventArgs _args);
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));
然后,收件人可以进行比较,看看是否确实是他们发送的。如果查看vanilla类的签名,第一个参数是
object sender
。这是.NET framework中的典型模式,它允许您与引发事件的对象进行相等性比较:
public EventHandler(object sender, EventArgs e)
{
if(this.Equals(sender))
{
//...
}
}
使用API的开发人员会很好地理解这个习惯用法,因此我认为遵循这个习惯用法是有意义的。当然。我不应该在这么晚的时候提出这些问题,因为我的大脑已经崩溃了。自1997年Delphi2.0以来,我一直在事件处理程序中使用对象发送器。