所以我有一个这样的事件签名:
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/