我不确定事件处理/类设计的最佳实践。
我有一个类有一个方法Discover。当方法完成时,它会引发一个事件DiscoveryCompleted。 DiscoveryCompleted事件具有EventArgs。
在Discover方法中,创建了一个对象列表。如果DiscoveryCompleted事件在EventArgs中触发(仍然需要创建一个派生自EventArgs的类),或者在类上设置为属性(ReadOnlyCollection),则应返回这些内容。我发现了一个bool,它在DiscoveryCompleted触发时设置,因此可用于确定是否应该填充数据。
答案 0 :(得分:3)
如果数据是可传递的(在事件触发后值可能会发生变化,并且您希望订阅者能够查看与该特定事件相关的数据)或者与您的组件没有直接关系(结果是异步调用组件以后不会自己使用它,然后在事件args中返回它。
否则,如果将值作为属性暴露在组件上(忽略您的事件)是有意义的,那么执行此操作并且不必担心EventArgs
。如果没有,那么将其包含在args中。
答案 1 :(得分:1)
我认为大多数开发人员会在继承自EventArgs的类中返回它们。这样,订阅您的事件的任何方法都会在其事件处理程序中得到结果。
class EventArgsX : EventArgs {
public IEnumerable<object> YourCollection { get; set; }
}
instance.SomeEvent += (s, args) => {
foreach(object O in args.YourCollection){
//do something
}
}
遗漏了很多,但我相信你明白了。
答案 2 :(得分:1)
这取决于相关数据的性质。如果数据成为类的一部分是有意义的,那么应该有一个属性。如果类封装数据没有意义,那么为它创建一个EventArg类。
考虑如何完成控件事件。 CheckBox.CheckChanged没有通过Checked状态,因为它作为CheckBox类的属性是有意义的,但是KeyPress事件传递了KeyPressEventArgs,因为按下的键与CheckBox本身无关。
答案 3 :(得分:0)
我认为这最终归结为您希望使用代码启用的体系结构/可扩展性点。 Discover
函数的使用者是否总是希望/需要与发现的object
进行交互?如果是这样,那么应该从Discover
方法返回它们。但是,如果调用Discover
使这些对象在内部与其他方法一起使用,并且知道哪些对象被发现是可选的(或者您不希望每次都在类核心功能之外对它们执行某些操作),那么提供通过活动提供的信息是一个不错的选择。