从 EventHandler 中删除除前两个参数之外的所有参数

Remove all, except the first two parameters from the EventHandler

提问人:RendonLs 提问时间:9/1/2020 更新时间:9/1/2020 访问量:139

问:

我在收到 FxCop 的警告 CA1009 时遇到了问题,该警告要求从事件中删除除前两个(object 和 EventArgs)之外的所有 poarameter。我还没有找到解决这个问题的方法,因为这些参数都不应该是对象或EventArgs类型。我尝试创建两种类型的两个类并将参数作为属性包含在内,但它没有使用参数/属性。

文档.cs

public delegate void UpdateZedGraphCounterDelegate(double[] newPackedOp, int i, double[] previousPackedOp, string numberLabel);
public static event UpdateZedGraphCounterDelegate LUTSelectionChanged;
private static void OnLUTSelectionChanged(double[] newPackedOp, int i, double[] previousPackedOp, string numberLabel)
{
    LUTSelectionChanged?.Invoke(newPackedOp, i, previousPackedOp, numberLabel);
}
C# 互操作 FXCOP

评论


答:

3赞 Matthew Watson 9/1/2020 #1

您应该将所有参数包装在一个派生自:EventArgs

public sealed class LUTSelectionChangedEventArgs: EventArgs
{
    public LUTSelectionChangedEventArgs(double[] newPackedOp, int i, double[] previousPackedOp, string numberLabel)
    {
        NewPackedOp      = newPackedOp;
        I                = i;
        PreviousPackedOp = previousPackedOp;
        NumberLabel      = numberLabel;
    }

    public double[] NewPackedOp      { get; }
    public int      I                { get; }
    public double[] PreviousPackedOp { get; }
    public string   NumberLabel      { get; }
}

然后像这样声明你的事件:

public static event EventHandler<LUTSelectionChangedEventArgs> LUTSelectionChanged;

并这样称呼它:

private static void OnLUTSelectionChanged(double[] newPackedOp, int i, double[] previousPackedOp, string numberLabel)
{
    LUTSelectionChanged?.Invoke(sender: null, new LUTSelectionChangedEventArgs(newPackedOp, i, previousPackedOp, numberLabel));
}

请注意,您必须如何传递 AS,因为它是从没有引用的静态方法调用的。sendernullthis

像这样的发件人并不常见,所以要小心。通常,从对象引发事件,并将对对象的引用作为参数传递。您应该考虑将其全部设置为非静态的,或者将 sender 对象传递给您的方法,以便可以将其作为 的参数传递。nullsenderOnLUTSelectionChanged()sender.Invoke()

1赞 sommmen 9/1/2020 #2

只是对@matthew答案的一个小补充,

请参阅有关事件的指南:

https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/event

✔️ 请使用 System.EventHandler,而不是手动创建要用作事件处理程序的新委托。

这很可能就是为什么会有这种风格规则的原因。因此,重构自定义事件处理程序以使用自定义对象,而不是多个参数。