在我的类中,我想声明一个其他类可以订阅的事件。正确的声明事件的方式是什么?
以下代码是不起作用的:
public event CollectMapsReportingComplete;
你忘记了提到类型。对于非常简单的事件,EventHandler
可能已经足够:
public event EventHandler CollectMapsReportingComplete;
有时候你会想要声明自己的委托类型来用于事件中,这可以让你使用自己的类型作为 EventArgs
参数(参见Adam Robinson的评论):
public delegate void CollectEventHandler(object source, MapEventArgs args);
public class MapEventArgs : EventArgs
{
public IEnumerable<Map> Maps { get; set; }
}
您还可以使用通用的EventHandler
类型,而不是声明自己的类型:
public event EventHandler<MapEventArgs> CollectMapsReportingComplete;
object
)发送器和一个继承自EventArgs
的额外参数。这样做还可以让你使用泛型的EventHandler<TEventArgs>
委托类型,而不必声明你自己的委托类型。当然,你的方法没有问题(它也能正常工作),但主流观点倾向于基于EventArgs的方式。 - Adam Robinson您需要指定事件的委托类型:
public event Action CollectMapsReportingComplete;
这里我使用了 System.Action
,但您可以使用任何委托类型(甚至是自定义委托)。指定的委托类型的实例将用作事件的后备字段。
/// </summary>
/// Event triggered when a search is entered in any <see cref="SearchPanel"/>
/// </summary>
public event EventHandler<string> SearchEntered
{
add { searchevent += value; }
remove { searchevent -= value; }
}
private event EventHandler<string> searchevent;
public event EventHandler MyEvent;
公共事件[DelegateType] [EventName];