在不使用 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... 那样命名,而只是例如颜色已更改。
所以我有一个这样的事件签名:
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... 那样命名,而只是例如颜色已更改。