C#前向接口事件

时间:2016-01-08 15:01:20

标签: c# events

我有一个定义事件的界面:

interface IEXampleinterface 
{
   event MyEventHandler MyEvent;
}

在我的GUI课程中,我正在调用一个"处理器"再次调用"解析器"实现接口的类:

class GUI
{
   public DoSomething()
   {
      Processor processor = new Processor();
      processor.MyEvent += new MyEventHandler(processor_myevent);
      processor.DoSomething();
   }
   public processor_myevent(object sender, EventArgs e)
   {
      ...
   }
}

处理器类:

class processor
{
   IExampleInterface parser;
   event MyEventHandler MyEvent;

   public void DoSomething()
   {
      parser = new Parser();
      parser.MyEvent += new MyEventHandler(parser_myevent);
      parser.DoStuff();
   }
   public void parser_myevent(object sender, EventArgs e)
   {
      if(MyEvent != null)
      {
         MyEvent(sender, e)
      }
   }
}

Parser class:

class Parser : IExampleinterface
{
   event MyEventHandler MyEvent;

   public void DoStuff()
   {
      MyEvent(this, new EventArgs());
   }
}

正如您所看到的,"处理器"上课只是从" Parser"并将其转发到GUI。这完全有效,但我问是否有更优雅的方式来进行这种事件转发。

2 个答案:

答案 0 :(得分:2)

您可以直接指向该事件,而不是创建新事件并传递事件:

public event MyEventHandler MyEvent
{
    add
    {
        parser.MyEvent += value;
    }
    remove
    {
        parser.MyEvent -= value;
    }
}

我不确定这是否是最漂亮的事情,也许你会有更好的设计。但是,在我找到更好的方法之前,这将完成工作;)。

答案 1 :(得分:2)

首先,执行MyEvent(sender, e)被视为“错误”,发件人参数应始终为this,以便您知道哪个事件发布者提出了该事件。 GUI没有引用parser所以它无法进行任何正常的比较来判断哪个解析器引发了事件,这可能会破坏一些依赖于“标准”事件模式的UI框架。 / p>

话虽如此,您可以更改订阅和取消订阅事件的方式以转发订阅

class processor
{
   IExampleInterface parser;
   event MyEventHandler MyEvent
   {
      add { parser.MyEvent += value; }
      remove { parser.MyEvent -= value; }
   }

这与MyEvent(sender, e)

的行为相同