gpt4 book ai didi

c# - 赋予委托(delegate)属性的优雅方式

转载 作者:行者123 更新时间:2023-12-03 22:52:05 24 4
gpt4 key购买 nike

假设我在类里面有一些事件:

 class SomeClass{
event ChangedEventHandler SomeDoubleChanged;
double SomeDouble;
}

与:

 delegate void ChangedEventHandler(double d);

现在假设我想监听 SomeDouble 上的更改事件,但只想触发大于 delta 的更改。现在我可以做类似的事情了

 SomeObject.SomeDoubleChanged += (d) => {if(abs(d-old_d) > delta){
//do something
};

但我希望我的事件能够处理这个,所以在最好的情况下我想做类似的事情:

 SomeObject.SomeDoubleChange += (delta, (d) => {});

并且仍然允许:

 SomeObject.SomeDoubleChange += (d) => {};

我想到的实现这个的唯一方法是删除整个事件关键字并实现一个带有 += 和 -= 运算符的容器,对指定的委托(delegate)进行操作。但在我看来,这不是一个非常优雅的解决方案,因为它让 SomeClass 的用户认为 SomeDoubleChanged 不是事件。

这个问题最优雅的解决方案是什么?

最佳答案

(我建议不要在这里使用术语“lambda”,因为您也在使用 lambda 表达式。听起来您对变化很感兴趣,即 delta。)

您可以创建自己的静态方法来创建适当的委托(delegate):

public static ChangedEventHandler FilterByDelta(double delta,
ChangedEventHandler handler)
{
double previous = double.MinValue;
return d =>
{
if (d - previous > delta)
{
handler(d);
}
// Possibly put this in the "if" block? Depends on what you want.
previous = d;
};
}

然后你可以使用:

SomeObject.SomeDoubleChange += Helper.FilterByDelta(5, d => ...);

不幸的是,您不能在 lambda 表达式上使用扩展方法,这会使这更容易。

关于c# - 赋予委托(delegate)属性的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14438652/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com