我有很多代码,如下所示,在这些代码中,我显式地实现了接口所需的一些事件。
public class IMicrowaveNotifier {
event EventHandler<EventArgs> DoorClosed;
event EventHandler<EventArgs> LightbulbOn;
// ...
}
public class Microwave : IMicrowaveNotifier {
private EventHandler<EventArgs> _doorClosed;
event EventHandler<EventArgs> IMicrowaveNotifier.DoorClosed {
add { lock (this) _doorClosed += value; }
remove { lock (this) _doorClosed -= value; }
}
private EventHandler<EventArgs> _lightbulbOn;
event EventHandler<EventArgs> IMicrowaveNotifier.LightbulbOn {
add { lock (this) _lightbulbOn += value; }
remove { lock (this) _lightbulbOn -= value; }
}
// ...
}你可以看到这大部分都是样板。在Ruby中,我可以这样做:
class Microwave
has_events :door_closed, :lightbulb_on, ...
end在C#中有类似的更短的方法来去除这个样板吗?
更新:我在示例中遗漏了一个非常重要的部分:即实现的事件是接口的一部分,我希望显式地实现它。很抱歉之前没提到这件事!
发布于 2010-05-06 18:22:33
试试这个:
public class Microwave {
public event EventHandler<EventArgs> DoorClosed;
public event EventHandler<EventArgs> LightbulbOn;
}这段代码利用了C#的类字段事件语法
编译类似字段的事件时,编译器会自动创建存储以保存委托,并为事件创建访问器,该事件将向委托字段添加或删除事件处理程序。
在C# 1、2和3中,这段代码将编译到上面的代码。在C# 4中,您将得到与不使用显式锁功能相当的代码。无论哪种方式,您都可以使用此快捷方式而不更改此类型的使用者。
更新:不幸的是,编译器不允许您将类似字段的事件用于显式接口实现。如果您尝试,您将得到以下编译错误:
事件的显式接口实现必须使用事件访问器语法。
更新:--遗憾的是,显式接口实现需要使用事件访问器语法。如果C#添加了创建自动实现的类似于字段的事件的功能,这将是一种很酷的做法:
event EventHandler<EventArgs> IAppliance.DoorClosed { add; remove; }但是,这种语法已经比现有的类似字段的事件语法更加简洁,并且只适用于接口成员被显式实现的情况。我认为最好的情况是编译器只允许我们这样做:
event EventHandler<EventArgs> IAppliance.DoorClosed;发布于 2010-05-06 18:28:45
我不知道Lock是怎么做的,因为我是个新手,但是您可以将所有的控件或任何调用这些事件的东西连接到一个事件上。在这种情况下,只需执行一条if语句来检查是谁发送的。
我认为它看起来会整洁得多,但我想还需要做一些工作。
发布于 2010-05-06 18:36:43
为其编写代码片段并使用快捷方式。就像使用if,for,foreach{tab}{tab}一样。
https://stackoverflow.com/questions/2783420
复制相似问题