C# 是否可以将自定义EventArgs与SystemEvents一起使用?

C# 是否可以将自定义EventArgs与SystemEvents一起使用?,c#,events,C#,Events,我的第一篇帖子,抱歉,如果这已经被回答了-我已经搜索了又搜索了,但是没有找到任何关于在现有SystemEvents中使用自定义EventArgs的细节 我试图利用SystemEvents.PowerModeChanged类型的事件,但希望使用我自己的自定义EventArgs,而不是标准的PowerModeChangedEventArgs。我的方法是创建一个名为CustomPowerModeChangedEventArgs的类,该类继承自PowerModeChangedEventArgs并使用它们

我的第一篇帖子,抱歉,如果这已经被回答了-我已经搜索了又搜索了,但是没有找到任何关于在现有SystemEvents中使用自定义EventArgs的细节

我试图利用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方法。如果它是一个通用的eventhandler,我可以定义参数,如

public event EventHandler<CustomPowerModeChangedEventArgs> PowerModeCHanged;
公共事件事件处理程序PowerModeCHanged;

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

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

如果事件是使用
EventHandler
声明的,这仍然不会对您有所帮助-调用事件处理程序的代码已经编写好,它将传入一个它构造的事件,而不是您类型的实例


现在,您可以使用自定义事件参数声明自己的事件,然后挂接到
SystemEvents
,以便在引发系统事件时引发自己的事件(使用自己的事件参数实例,但您决定构造它)。。。但是,您不应该期望能够添加事件处理程序,因为它需要事件引发者(在本例中是系统)不知道的信息。

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

如果事件是使用
EventHandler
声明的,这仍然不会对您有所帮助-调用事件处理程序的代码已经编写好,它将传入一个它构造的事件,而不是您类型的实例


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

这是有道理的,谢谢Jon Skeet。这是否意味着,为了在使用自定义参数进行某种系统属性更改时触发事件,我需要编写一个新类,或者将两个事件和一个自定义事件与预定义的PowerModeChanged事件结合使用?@Chi:是-基本上从系统的角度考虑。它知道如何引发事件并构造自己的事件参数。只有您的代码才能创建事件参数的实例。谢谢Jon Skeet,非常感谢。经过完美的解释,我现在觉得我对这件事有了一些清晰的认识。感谢您花时间传授您的知识,并感谢天啊stackoverflow.com的存在。这很有意义,谢谢Jon Skeet。这是否意味着,为了在使用自定义参数进行某种系统属性更改时触发事件,我需要编写一个新类,或者将两个事件和一个自定义事件与预定义的PowerModeChanged事件结合使用?@Chi:是-基本上从系统的角度考虑。它知道如何引发事件并构造自己的事件参数。只有您的代码才能创建事件参数的实例。谢谢Jon Skeet,非常感谢。经过完美的解释,我现在觉得我对这件事有了一些清晰的认识。感谢您抽出时间传授您的知识,并感谢上天赐予stackoverflow.com的存在。