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

Subscribing to event inside a method while passing extra parameters from this method without using a lambda expression

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

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);
}

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

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

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

您可以像这样使用本地函数:

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

    void updateColor(object sender, OnColorChangedEventArgs e)
    {
        UpdateColor(sender, e, positionOnLine);
    }

    rayCaster.onColorChanged += updateColor;
    rayCaster.onColorChanged -= updateColor;
}

顺便说一句:事件不应该像 on... 那样命名,而只是例如颜色已更改。