Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何判断生成的事件是否由它发送';我们自己的班级_C# 4.0 - Fatal编程技术网

C# 4.0 如何判断生成的事件是否由它发送';我们自己的班级

C# 4.0 如何判断生成的事件是否由它发送';我们自己的班级,c#-4.0,C# 4.0,是否有一种方法可以判断事件是否在其自己的调用者中引发。基本上我有1.N个类,基本上都是一样的,每个类都由一个线程运行。我有一个区分基本类型的枚举。我在顶级类ExecutionState中有一个委托,它创建所有子类(将它们存储在集合中)。我每节课都有以下内容。ExecutionState是顶级creator类,其中包含委托和关联的事件 public void Subscribe(ExecutionState ExecState) { if (this.Express

是否有一种方法可以判断事件是否在其自己的调用者中引发。基本上我有1.N个类,基本上都是一样的,每个类都由一个线程运行。我有一个区分基本类型的枚举。我在顶级类ExecutionState中有一个委托,它创建所有子类(将它们存储在集合中)。我每节课都有以下内容。ExecutionState是顶级creator类,其中包含委托和关联的事件

    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以来,我一直在事件处理程序中使用对象发送器。