我有一个定义事件的界面:
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。这完全有效,但我问是否有更优雅的方式来进行这种事件转发。
答案 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)