将附加参数传递给事件处理程序

时间:2021-06-25 06:29:02

标签: c#

我有一个接受以下事件签名的事件处理程序(这是来自第三方库,因此我无法更改事件处理程序):

Task handleEvent(SomeEventArgs args)

我像这样注册我的处理程序:

eventProcessor.ProcessEventsAsync += handleEvent;

并实现这样的方法:

private async Task handleEvent(SomeEventArgs args)
{
    if (args.Data.Test == parameterValue) {}
}

问题是我想找到一种方法将 parameterValue 传递给处理程序。我意识到我可以通过将它存储为类中的字段或属性来做到这一点,但想知道是否有办法直接传递它。

3 个答案:

答案 0 :(得分:2)

如果您有订阅时可用的参数,则可以使用 lambda 函数:

...
{
    eventProcessor.ProcessEventsAsync += (arg) => handleEvent(arg, parameterValue);
}

private async Task handleEvent(SomeEventArgs args, object parameter)
{
    if (args.Data.Test == parameter) {}
}

只需将 object 更改为您的类型。

答案 1 :(得分:1)

它是引发将参数传递给处理程序的事件的库。如果那个库不支持它(例如,通过给你一些你可以设置的对象属性,当它引发事件时它会返回给你),那么你必须按照你提议的方式进行;处理类保留知识并在引发事件时使用它

答案 2 :(得分:0)

您可以更改方法的签名并定义作为此方法委托的字段:

private Func<SomeEventArgs,string,Task> handleEventDelegate = handleEvent;
private async Task handleEvent(SomeEventArgs args, string parameterValue)
{
    if (args.Data.Test == parameterValue) {}
}

您可以订阅和订阅您的活动:

eventProcessor.ProcessEventsAsync += handleEventDelegate;
eventProcessor.ProcessEventsAsync -= handleEventDelegate;