调用多态字段事件

时间:2010-10-15 06:16:53

标签: c# events polymorphism override

考虑以下代码:

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???
        }
    }
}

在此代码中,ReSharper显示警告“调用多态字段事件”。

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

1 个答案:

答案 0 :(得分:42)

嗯,你实际上在这里有两个字段式事件。您的覆盖将覆盖添加/删除部分,但您将有两个字段 - 一个在TableMain中,另一个在TableSub中。只有TableSub中的那个才会是非空的,除非在TableMain中明确设置了值...所以如果TableMain曾尝试提升事件本身,则不会调用与TableSub中相同的一组处理程序。基本上,它会表现得很奇怪。

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

protected void OnUpdateFilter()
{
    Action handler = UpdateFilter;
    if (handler != null)
    {
        handler();
    }
}

然后将事件设为非虚拟,并删除TableSub中的覆盖。

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