【问题标题】:EventHandler type with no event args没有事件参数的 EventHandler 类型
【发布时间】:2011-09-17 14:10:39
【问题描述】:

当我们想要将数据传递给事件订阅者时,我们使用 EventArgs(或 CustomEventArgs)。

.Net 提供了一个内置类型 EventHandler,它使用内置的 EventArgs 类的实例作为参数。

如果我需要通知订阅者某项操作已结束,例如搜索已结束,该怎么办?我什至不想使用 EventArgs,它不包含任何内容。

是否有用于向另一个类发出信号的内置类型,而无需使用空的 EventArgs?

【问题讨论】:

    标签: c# events signals


    【解决方案1】:

    我真的建议你在这里使用标准的 EventHandler 模式,然后通过 EventArgs.Empty。但是,如果您真的需要,可以使用Action 作为事件类型——这很不寻常。

    【讨论】:

      【解决方案2】:

      如果你使用普通的delegates,你当然可以做你想做的事,但如果你使用events,我认为最好的办法是坚持标准,并且始终拥有object sender 和EventArgs e。

      如果你真的不知道在你自己的代码中触发这些事件时要传递什么,只需传递 EventArgs.Empty 作为第二个参数。

      【讨论】:

        【解决方案3】:

        您有多种选择:

        1. 使用带有EventHandler 和基本EventArg 类的普通事件——确保事件为空,但这有什么害处吗?
        2. 制作您自己的委托并将其与event MyDelegateWithoutParams MyEvent; 一起使用
        3. 使用带有IObservable 的观察者模式。
        4. 让客户将Action 传递给您并调用此操作。

        我希望这些选项之一是您喜欢的。对于这种情况,我使用 1 和 4(如果只有一个“听众”,则主要是 4 个)。

        PS:我猜 2 不符合 .NET framework guidelines,所以也许那个不是最好的主意 ;)

        【讨论】:

          【解决方案4】:

          使用操作(以下答案复制自https://stackoverflow.com/a/1689341/1288473):

          声明:

          public event Action EventWithoutParams; 
          public event Action<int> EventWithIntParam;
          

          调用:

          EventWithoutParams?.Invoke(); 
          EventWithIntParam?.Invoke(123);
          

          【讨论】:

          • 这是对OP问题最直接的回答
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-11-28
          • 2021-10-15
          • 1970-01-01
          • 1970-01-01
          • 2014-06-16
          • 2018-04-25
          • 1970-01-01
          相关资源
          最近更新 更多