从 EventHandler 中删除除前两个参数之外的所有参数
Remove all, except the first two parameters from the EventHandler
我在处理来自 FxCop 的警告 CA1009 时遇到问题,要从事件(对象和 EventArgs)中删除除前两个参数之外的所有参数。我还没有找到解决这个问题的方法,因为这些参数中 none 应该是 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);
}
您应该将所有参数包装在从 EventArgs
:
派生的单个 class 中
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
参数传递。您应该考虑将其全部设为 non-static,或者将发送者对象传递给您的 OnLUTSelectionChanged()
方法,以便您可以将其作为 .Invoke()
.[=22 的 sender
参数传递=]
只是对@matthew 的回答的一小部分补充,
查看活动指南:
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/event
✔️ DO use System.EventHandler instead of manually creating new delegates to be used as event handlers.
这很可能就是制定此样式规则的原因。因此重构您的自定义事件处理程序以使用自定义对象,而不是几个参数。
我在处理来自 FxCop 的警告 CA1009 时遇到问题,要从事件(对象和 EventArgs)中删除除前两个参数之外的所有参数。我还没有找到解决这个问题的方法,因为这些参数中 none 应该是 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);
}
您应该将所有参数包装在从 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
参数传递。您应该考虑将其全部设为 non-static,或者将发送者对象传递给您的 OnLUTSelectionChanged()
方法,以便您可以将其作为 .Invoke()
.[=22 的 sender
参数传递=]
只是对@matthew 的回答的一小部分补充,
查看活动指南:
https://docs.microsoft.com/en-us/dotnet/standard/design-guidelines/event
✔️ DO use System.EventHandler instead of manually creating new delegates to be used as event handlers.
这很可能就是制定此样式规则的原因。因此重构您的自定义事件处理程序以使用自定义对象,而不是几个参数。