gpt4 book ai didi

c# - 在不使用 lambda 表达式的情况下从该方法传递额外参数时在方法内部订阅事件

转载 作者:行者123 更新时间:2023-12-05 09:32:57 24 4
gpt4 key购买 nike

所以我有一个这样的事件签名:

public event EventHandler<OnColorChangedEventArgs> onColorChanged;

public class OnColorChangedEventArgs : EventArgs
{
public Color color;
}

还有一个我想像这样订阅事件的方法:

private void UpdateColor(object sender, RayCaster.OnColorChangedEventArgs eventArgs, PositionOnLine positionOnLine)
{
if (positionOnLine == PositionOnLine.Start)
{
_lineRenderer.startColor = eventArgs.color;
}
else
{
_lineRenderer.endColor = eventArgs.color;
}
}

如您所见,订阅方法需要的参数比事件调用传递的参数多。这些额外的参数应该首先从我​​调用的订阅事件的方法传递,如下所示:

public void AddPoint(RayCaster rayCaster, PositionOnLine positionOnLine, Transform transform)
{
//some irrelevant code

rayCaster.onColorChanged += (sender, args) => UpdateColor(sender, args, positionOnLine);
}

这如我所愿。但是,据我了解,这是一个匿名代表。我需要在某个时候取消订阅此方法。我似乎找不到将其变成非匿名代表的方法。我对委托(delegate)和事件很陌生,所以请指出任何代码味道。谢谢。

最佳答案

委托(delegate)签名必须匹配,所以:你不能在这里作弊。如果您以后真的需要取消订阅,您可以将委托(delegate)实例存储在某处,即

EventHandler<OnColorChangedEventArgs> handler = (sender, args) =>
UpdateColor(sender, args, positionOnLine);
rayCaster.onColorChanged += handler;
// ... and later
rayCaster.onColorChanged -= handler;

关于c# - 在不使用 lambda 表达式的情况下从该方法传递额外参数时在方法内部订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67619221/

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