多次使用事件实现通用接口

Implement generic interface with event multiple times

我有一个通用界面,如下所示:

public interface IObjectProvider<out T>
{
    event Action<T> ValueOccured;
}

现在我想做一个class,实现这个接口两次,像这样:

public class GlobalReceiver : IObjectProvider<Foo>, IObjectProvider<Bar>
{
    public event Action<Foo> IObjectProvider<Foo>.ValueOccured;

    public event Action<Bar> IObjectProvider<Bar>.ValueOccured;
}

并且无法让它工作,因为对于这个编译器来说,我需要使用正确的语法,如果我进行非显式实现,我(如预期的那样)得到一个错误:

Member is already declared.

如何解决这个问题?

您必须明确说明如何在事件上实现 addremove,因为它是一个显式接口实现:

public class GlobalReceiver : IObjectProvider<Foo>, IObjectProvider<Bar>
{
    private event Action<Foo> ActionFoo;

    event Action<Foo> IObjectProvider<Foo>.ValueOccured { add { ActionFoo += value; } remove { ActionFoo -= value; } }

    private event Action<Bar> ActionBar;

    event Action<Bar> IObjectProvider<Bar>.ValueOccured { add { ActionBar += value; } remove { ActionBar -= value; } }
}

我添加了一个默认实现,您可以将其用于实际事件,使它们可以从您的 class 访问。

为什么?可能是因为您不能仅从 class 中的成员名称调用事件,因此很难调用事件处理程序。

显式接口实现不能是public。删除 public 访问器。

此外,如 How to: Implement Interface Events (C# Programming Guide) 中所述:

When you write an explicit interface implementation for an event, you must also write the add and remove event accessors.