我有一个接受以下事件签名的事件处理程序(这是来自第三方库,因此我无法更改事件处理程序):
Task handleEvent(SomeEventArgs args)
我像这样注册我的处理程序:
eventProcessor.ProcessEventsAsync += handleEvent;
并实现这样的方法:
private async Task handleEvent(SomeEventArgs args)
{
if (args.Data.Test == parameterValue) {}
}
问题是我想找到一种方法将 parameterValue
传递给处理程序。我意识到我可以通过将它存储为类中的字段或属性来做到这一点,但想知道是否有办法直接传递它。
答案 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;