提升显式实施事件

时间:2014-03-23 10:07:38

标签: c#

考虑以下星座。

public delegate void BarHandler(Foo sender, FooEventArgs<Object> args);
public delegate void BarHandler<T>(Foo<T> sender, FooEventArgs<T> args);

public interface Foo
{
    Object Value
    { get; }

    event BarHandler BarEvent;

    void Update();
}

public interface Foo<T> : Foo
{
    new T Value
    { get; }

    new event BarHandler<T> BarEvent;
}

public class Baz<T> : Foo<T>
{
    Object Foo.Value
    { get { return Value; } }

    public T Value
    { get; set; }

    private BarHandler handler;

    event BarHandler Foo.BarEvent
    {
        add{ handler += value; }
        remove{ handler -= value; }
    }

    public event BarHandler<T> BarEvent;

    public void Update()
    {
        BarEvent(this, new FooEventArgs<T>());
        (this as Foo).BarEvent(this, new FooEventArgs<Object>());
    }
}

我有一个接口和一个通用接口,它扩展了第一个接口和一个扩展通用接口的类。通用接口通过new关键字隐藏非通用接口。 Update方法应该引发非泛型和通用方法。这就是我目前正在处理的问题。 产生的错误是:

The event BarEvent can only appear on the left hand side of += or -= when used outside of Foo.

但我在Foo,或者我错过了什么?

所以,我想要的是,无论客户端注册的是哪个事件,都应该通知它。我还应该提一下,添加和删除都必须有效,因此没有代表或类似的选项。

1 个答案:

答案 0 :(得分:4)

只需使用私有handler变量,这应该可以解决问题。

public void Update()
{
    BarEvent(this, new FooEventArgs<T>());
    handler(this, new FooEventArgs<Object>());
}

BarEvent检查handlernull可能也是个好主意。