在 C# 中转发事件
我正在使用一个在 C# 中转发事件的类。 我想知道是否有办法做 它需要更少的代码开销。
这是我到目前为止所拥有的一个例子。
class A
{
public event EventType EventA;
}
class B
{
A m_A = new A();
public event EventType EventB;
public B()
{
m_A.EventA += OnEventA;
}
public void OnEventA()
{
if( EventB )
{
EventB();
}
}
}
A 类引发原始事件。 B 类将其作为 EventB 转发(本质上是同一事件)。 A 类对其他模块是隐藏的,因此它们无法直接订阅 EventA。
我想做的是减少 B 类中用于转发事件的代码开销,因为通常 B 类中没有真正处理事件。此外,我还将有几个不同的事件,因此需要编写大量 OnEvent B 类中的 () 方法仅用于转发事件。
是否可以以某种方式自动将 EventA 链接到 EventB,所以我会有这样的内容:
class B
{
A m_A = new A();
public event EventType EventB;
public B()
{
m_A.EventA += EventB; // EventA automatically raises EventB.
}
}
顺便说一句,我正在使用 C# 2.0 编译器。
I'm using a class that forwards events in C#. I was wondering if there's a way of doing
it that requires less code overhead.
Here's an example of what I have so far.
class A
{
public event EventType EventA;
}
class B
{
A m_A = new A();
public event EventType EventB;
public B()
{
m_A.EventA += OnEventA;
}
public void OnEventA()
{
if( EventB )
{
EventB();
}
}
}
Class A raises the original event. Class B forwards it as EventB (which is essentially the same event). Class A is hidden from other modules so they can't subscribe to EventA directly.
What I'm trying to do is reduce the code overhead in class B for forwarding the event, as typically there's no real handling of the events in class B. Also I'll have several different events so it would require writing a lot of OnEvent() methods in class B that only serve to forward the events.
Is it possible to automatically link EventA to EventB in some way, so I'd have something like this:
class B
{
A m_A = new A();
public event EventType EventB;
public B()
{
m_A.EventA += EventB; // EventA automatically raises EventB.
}
}
I'm using a C# 2.0 compiler btw.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
绝对:
换句话说,EventB 订阅/取消订阅代码只是将订阅/取消订阅请求传递给 EventA。
但请注意,这不允许您仅为订阅了 EventB 的订阅者引发事件。 这就像将某人的地址直接传递给大众营销公司,而您原来的方式更像是自己订阅大众营销公司,并允许人们要求您将邮件副本发送给他们。
Absolutely:
In other words, the EventB subscription/unsubscription code just passes the subscription/unsubscription requests on to EventA.
Note that this doesn't allow you to raise the event just for subscribers who subscribed to EventB, however. It's like passing someone's address directly onto a mass marketing company, whereas your original way is more like subscribing to the mass marketing company yourself, and allowing people to ask you to send copies of the mails to them.
IMO,您的原始代码(或多或少)是正确的。 特别是,它允许您提供正确的
sender
(对于那些认为自己正在订阅B
上的事件的人来说,这应该是B
实例) >)。如果未订阅事件,有一些技巧可以减少运行时的开销,但这会添加更多代码:
IMO, your original code is (more or less) correct. In particular, it allows you to provide the correct
sender
(which should be theB
instance for people who think they are subscribing to an event onB
).There are some tricks to reduce the overheads at runtime if the event isn't subscribed, but this adds more code:
这就是我的想法:
这比我通常想要的代码要多一些。 我怀疑有办法让它更简洁,但它对于我的目的来说已经足够好了。
This is what I came up with:
It's a bit more code than I would normally like. I suspect there's way to make it more concise, but it worked well enough for my purposes.