C#在不同接口上具有不同类型的相同属性

时间:2013-10-21 14:21:21

标签: c# .net

我有两个界面(一个用于订阅者,一个用于发布者):

对于允许举起活动的客户

,第一个应该是可见的
   public interface IClientLogicEvents
   {
      IRaiseEvent<CallStateChangedEventArgs> CallStateChanged { get; }
   }

对订阅和处理这些事件的客户来说,第二个应该是可见的

   public interface IHandleOnlyClientLogicEvents : IClientLogicEvents
   {
      ISubscribeEvent<CallStateChangedEventArgs> CallStateChanged { get; }
   }

Event接口看起来像这样

   public interface ISubscribeEvent<out TEventArgs> where TEventArgs : EventArgs
   {
      void Subscribe(Action<object, TEventArgs> handler);
      void Unsubscribe(Action<object, TEventArgs> handler);
   }

    public interface IRaiseEvent<TEventArgs> : ISubscribeEvent<TEventArgs> where TEventArgs : EventArgs
   {
      void Raise(object sender, TEventArgs args);
   }

现在我想要一个实现这两个接口的类(IClientLogicEvents和IHandleOnlyClientLogicEvents)。

像这样:

public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents

或:

 public sealed class ClientLogicEvents : IHandleOnlyClientLogicEvents

问题现在当然是我需要实现两次属性(对于每个接口),这需要额外的字段来存储它。

    public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents, IDisposable
   {
      /// <summary>
      /// The internal call state changed event.
      /// </summary>
      private readonly CustomEvent<CallStateChangedEventArgs> _callStateChangedEvent;

      public ClientLogicEvents()
      {
         _callStateChangedEvent = new CustomEvent<CallStateChangedEventArgs>();
      }

      /// <summary>
      /// Gets the invokeable call state changed event.
      /// </summary>
      IRaiseEvent<CallStateChangedEventArgs> IClientLogicEvents.CallStateChanged { get { return _callStateChangedEvent; } }

      /// <summary>
      /// Gets the subscribe only call state changed event.
      /// </summary>
      ISubscribeEvent<CallStateChangedEventArgs> IHandleOnlyClientLogicEvents.CallStateChanged { get { return _callStateChangedEvent; } }
   }

但是我想为属性实现保存这么多代码(因为我有200个事件)。 这有可能以某种方式。我只有像

这样的东西
    public sealed class ClientLogicEvents : IClientLogicEvents, IHandleOnlyClientLogicEvents, IDisposable
   {
      /// <summary>
      /// Gets the invokeable call state changed event.
      /// </summary>
      public IRaiseEvent<CallStateChangedEventArgs> CallStateChanged { get; private set; }
   }

1 个答案:

答案 0 :(得分:1)

您不能拥有一个满足两个接口约束的属性,因为单个属性不能同时具有两种类型(IRaiseEvent<CallStateChangedEventArgs>ISubscribeEvent<CallStateChangedEventArgs>)。

问题底部的示例未实现IHandleOnlyClientLogicEvents界面。