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

Posted

技术标签:

【中文标题】从 EventHandler 中删除除前两个参数外的所有参数【英文标题】:Remove all, except the first two parameters from the EventHandler 【发布时间】:2020-09-01 08:13:55 【问题描述】:

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

Doc.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);

【问题讨论】:

【参考方案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));

注意您必须如何将sender 传递为null,因为它是从没有this 引用的静态方法调用的。

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

【讨论】:

我倾向于给你一个 +1 只是为了格式化 @MichaelRandall 我很懒惰,实际上是 Resharper 为我进行了格式化。 ;)【参考方案2】:

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

查看活动指南:

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

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

这很可能是该样式规则存在的原因。因此,重构您的自定义事件处理程序以使用自定义对象,而不是多个参数。

【讨论】:

以上是关于从 EventHandler 中删除除前两个参数外的所有参数的主要内容,如果未能解决你的问题,请参考以下文章

使用 JQuery 从列表中删除除前 N 个元素之外的所有元素

如何删除所有eventhandler

移除前一个单元格时,UiCollectionView 跳转到下一个单元格

事件2 (标准 EventHandler)

4.1.6EventHandler自定义事件参数类

为 UIBarButtonItem 添加/删除 EventHandler