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

标签 c# events event-handling

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

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/

相关文章:

c# - 适用于 Windows Phone 8.1 的 Google Api 任务客户端库

c# - 继承:访问父成员

c# - 事件支持 WP 8.1

c# - 动态添加按钮的onclick事件

jquery - Backbone View 事件获得正确的目标

c# - Xamarin Android ImageView 缩放

c# - 如何按存储在我的列表 <> 保存的结构中的整数对列表 <> 进行排序

MySQL 事件调度程序不工作,但一切都已设置

jQuery - 将事件附加到动态元素

events - ZF3 - 附加到 EventManager 的事件未触发