问题描述
我无法使用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,而不是手动创建用作事件处理程序的新委托。
这很可能是为什么存在此样式规则的原因。因此,将您的自定义事件处理程序重构为使用自定义对象,而不是几个参数。