【问题标题】:Is it possible to use Custom EventArgs with SystemEvents?是否可以将自定义 EventArgs 与 SystemEvents 一起使用?
【发布时间】:2016-04-09 10:40:55
【问题描述】:

我的第一篇文章,如果这个问题已经得到解答,我深表歉意 - 我已经搜索和搜索,但没有找到任何关于使用自定义 EventArgs 和现有 SystemEvents 的细节。

我正在尝试利用 SystemEvents.PowerModeChanged 类型的事件,但想使用我自己的自定义 EventArgs 而不是标准的 PowerModeChangedEventArgs。我的方法是创建一个名为 CustomPowerModeChangedEventArgs 的类,它继承自 PowerModeChangedEventArgs 并改用这些类,但我不知道如何告诉 PowerModeChangedEventHandler 使用这些新的 CustomEvent 参数。我的代码如下:

   //Define the custom args which inherit from the PowerModeChangedEventArgs
    public class CustomPowerModeChangedEventArgs : PowerModeChangedEventArgs
    {
       public string batterylevel { get; set; }
    }

   //event raising method with CustomArgs instead of the PowerModeChangedEventArgs
    protected virtual void PowerModeChanged(object source, CustomPowerModeChangedEventArgs e)
    {

    }

SystemEvents.PowerModeChanged += new PowerModeChangedEventHandler(PowerModeChanged);

问题在于 PowerModeEventChangedHandler 不接受带有 CustomArgs 的 PowerModeChanged 方法。如果它是一个通用的事件处理程序,我可以定义像...

public event EventHandler<CustomPowerModeChangedEventArgs> PowerModeCHanged;

...但我无法理解如何使用非通用事件处理程序实现类似的功能。我怀疑有可能使用 lambda 表达式将新的自定义参数发送到处理程序,但我真的不确定 - 也许我需要定义一个全新的 EventChangedHandler?任何建议将不胜感激。

【问题讨论】:

    标签: c# events


    【解决方案1】:

    不,您无法决定事件处理程序具有哪些参数。请记住,系统中已经有代码将调用您的事件处理程序...您希望它如何构造您的CustomPowerModeChangedEventArgs 的实例?

    如果事件是使用EventHandler&lt;T&gt; 声明的,那仍然对您没有帮助 - 调用事件处理程序的代码已经编写好了,它将传入一个PowerModeChangedEventArgs 它 构造,而不是您的类型的实例。

    现在您可以使用自定义事件参数声明您的 自己的 事件,然后挂钩到 SystemEvents 以便您引发自己的事件(使用您自己的事件参数的实例,但是你决定构造它)当系统事件被引发时......但你不应该期望能够添加一个事件处理程序,它需要事件引发者(在这种情况下是系统)不知道的信息。

    【讨论】:

    • 有道理,谢谢 Jon Skeet。这是否意味着为了使用自定义参数在某种系统属性更改上触发事件,我需要编写一个新类或使用两个事件和一个自定义事件以及预定义的 PowerModeChanged 事件?
    • @Chi:是的——基本上是从系统的角度考虑。它知道如何引发事件并构造自己的事件参数。只有 your 代码会创建 your 事件参数的实例。
    • 谢谢 Jon Skeet,非常感谢。完美的解释,我现在觉得我对这个问题有了一些清晰的认识。感谢您花时间传授您的知识,并感谢上天赐予 stackoverflow.com 的存在。
    猜你喜欢
    • 2015-05-08
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多