【问题标题】:Is it possible to filter properties available on an interface by using one of the interfaces it implements?是否可以通过使用它实现的接口之一来过滤接口上可用的属性?
【发布时间】:2012-08-30 15:33:09
【问题描述】:

背景:

我不确定如何准确地表达这个问题,所以这是我想要实现的示例:

public interface IEverythingVM : IA, IB
{
    MyTypeA {get;}
    MyTypeB {get;}
    MyTypeC {get;}

    MyTypeD {get;}
    MyTypeE {get;}
    MyTypeF {get;}
}

public class EverythingVM : IEverythingVM
{
    // Populate everything from MyTypeA to MyTypeF
}

public interface IA
{
    MyTypeA {get;}
    MyTypeB {get;}
    MyTypeC {get;}
}


public interface IB
{
    MyTypeD {get;}
    MyTypeE {get;}
    MyTypeF {get;}
}

实现:

我的印象是我可以做类似以下的事情,但是写出来之后,很明显为什么它不起作用 - 我正在尝试做一些大的事情,对它进行定义,然后 重新定义 它,这是一个非常荒谬的概念,让我想大声笑出来。

{
    IA varIA = new EverythingVM(param1, param2);
    IB varIB = new EverythingVM(param1, param2);

    var cm = new ComparisonManager(varIA, varIB);        
}

public class ComparisonManager
{
    public ComparisonManager(IEverythingVM varEIA, IEverythingVM varEIB)
    {
        // be able to acces MyTypeA, MyTypeB & MyTypeC from varEIA
        // be able to acces MyTypeD, MyTypeE & MyTypeF from varEIB
    }
}

问题

最终我想要实现的是,在某些情况下我想要MyTypeAMyTypeBMyTypeCComparisonManager 中可用,而在其他情况下我想要MyTypeDMyTypeE 和@ 987654329@ 在ComparisonManager 可用。鉴于当前的结构,我有什么办法可以实现这一目标?

【问题讨论】:

    标签: c# oop interface


    【解决方案1】:

    你为什么不这样做:

    public class ComparisonManager
    {
        public ComparisonManager(IA varEIA, IB varEIB) {}
    }
    

    ?

    【讨论】:

      【解决方案2】:

      原来的解决方案是:

      public class ComparisonManager<T>
      {
          private readonly T _diskServiceVm;
          private readonly T _panelServiceVm;
      
          public ComparisonManager(T diskServiceVm, T panelServiceVm)
          {
              _diskServiceVm = diskServiceVm;
              _panelServiceVm = panelServiceVm;
          }
      }
      

      实施:

      if (/* circumstance A */)
      {
          IA varIA = new A(varA, varB);
          IA varIB = new B(varA, varB);
      
          // this knows how to deal with MyTypeA, MyTypeB & MyTypeC
          var comparisonManager = new ComparisonManager<IA>(varIA , varIB);
      }
      else
      {
          IB varIA = new A(varA, varB);
          IB varIB = new B(varA, varB);
      
          // this knows how to deal with MyTypeD, MyTypeE & MyTypeF
          var comparisonManager = new ComparisonManager<IB>(varIA , varIB);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-17
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多