多次使用事件实现通用接口
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.
如何解决这个问题?
您必须明确说明如何在事件上实现 add
和 remove
,因为它是一个显式接口实现:
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.
我有一个通用界面,如下所示:
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.
如何解决这个问题?
您必须明确说明如何在事件上实现 add
和 remove
,因为它是一个显式接口实现:
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.