多次实现事件的通用接口

时间:2015-03-02 11:41:50

标签: c# .net generics inheritance interface

我有一个通用接口,如下所示:

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

现在我想创建一个类,它实现了这个接口两次:

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

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

并且无法使其正常工作,因为对于这个编译器说我需要使用正确的语法,如果我进行非显式实现,我(如预期的那样)会出错:

  

会员已经宣布。

我怎样才能找出这个问题?

2 个答案:

答案 0 :(得分:7)

您必须明确告诉如何在事件上实现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; } }
}

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

为什么呢?可能是因为你不能只从类中的成员名称调用事件,所以调用事件处理程序将非常困难。

答案 1 :(得分:2)

显式接口实现无法公开。删除public访问者。

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

  

为事件编写显式接口实现时,还必须编写添加和删除事件访问器。