调用多态字段事件

Man*_*ani 25 c# polymorphism events overriding

考虑以下代码:

public class TableMain {
    public virtual event Action UpdateFilter;
    ....
}

public class TableSub : TableMain {
    public override event Action UpdateFilter;

    public void UpdateQuery() {
        .....
        if (UpdateFilter!=null) {
              UpdateFilter(); // Invocation of polymorphic field-like event???
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此代码中,ReSharper显示警报"调用多态字段事件".

我的问题是:它究竟意味着什么?这是一个糟糕的编程习惯的警报吗?此外,以多态方式调用事件是不好的做法吗?(知道事件只能从声明它的类中提出.)

Jon*_*eet 42

嗯,你实际上在这里有两个类似场的事件.您的覆盖将覆盖添加/删除部分,但您将拥有两个字段 - 一个输入TableMain和一个输入TableSub.只有in中的那个TableSub才会是非null,除非在TableMain...中明确设置了值,所以如果TableMain尝试引发事件本身,它将不会调用同一组处理程序TableSub.基本上,它会表现得很奇怪.

正确的方法是提供受保护的方法,TableMain以允许子类引发事件:

protected void OnUpdateFilter()
{
    Action handler = UpdateFilter;
    if (handler != null)
    {
        handler();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后使事件非虚拟,并删除覆盖TableSub.

请注意,您的事件签名与事件的正常约定不符 - 任何不使用的原因EventHandler

  • @Timores 我也有同样的情况。我认为您仍然收到警告的原因是因为假设的“TableSubSub”可以覆盖该方法。解决方案是在“TableSub”中使用“sealed override”,它修复了潜在的问题并删除了警告。 (2认同)