从EventHandler删除所有,除了前两个参数

问题描述

我无法使用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,string numberLabel)
{
    LUTSelectionChanged?.Invoke(newPackedOp,i,previousPackedOp,numberLabel);
}

解决方法

您应该将所有参数包装在一个从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,string numberLabel)
{
    LUTSelectionChanged?.Invoke(sender: null,new LUTSelectionChangedEventArgs(newPackedOp,i,previousPackedOp,numberLabel));
}

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

通常没有像这样的null发件人,所以要当心。通常,会从一个对象引发一个事件,并将对该对象的引用作为sender参数传递。您应该考虑将其全部设为非静态,或将发送方对象传递给您的OnLUTSelectionChanged()方法,以便可以将其作为sender的{​​{1}}参数传递。

,

除了@matthew的答案之外,

请参阅事件准则:

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

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

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...