2013-10-25 136 views
-1

我有兩個接口,兩者都具有相同的確切屬性。如何共享具有相同屬性的兩個接口的所有屬性

以防萬一你想知道爲什麼我有兩個這樣的接口這是一個很長的故事,但是,它必須是這樣。

基於條件,如果條件是另一種方式,List將被返回。

通過查看我的接口和我的代碼,我需要能夠使用一個對象,換句話說,如果無關緊要返回哪個接口我需要能夠使用一個對象而不是循環一個List接口並設置另一個的屬性。

我需要的是這樣的

compParts = genCompParts; 

---代碼使用

public class ComponentParts : IComponentParts 
    { 
     public ComponentParts() { } 
     public ComponentParts(Guid userID, int compID, bool isGeneric) 
     { 
      List<IComponentPart> compParts = null; 
      List<IComponentPart_Max> genCompParts = null; 

      if (isGeneric) 
      { 
       genCompParts = GenericCatalogBL.GenericCatalogManagerBL.GetComponentPartsMax(compID); 
      } 
      else 
      { 
       compParts = CatalogManagerDL.GetComponentParts(userID, compID); 
      } 

      var verParts = compParts.Where(x => x.CompTypeName.ToLower().Contains("vertical")); 
      if (verParts.Count() > 0) { this.Vertical = verParts.ToList<IComponentPart>(); } 

      var horParts = compParts.Where(x => x.CompTypeName.ToLower().Contains("horizontal")); 
      if (horParts.Count() > 0) { this.Horizontal = horParts.ToList<IComponentPart>(); } 

//... redundant code omitted 

---接口快照---

Interface Snapshots


我最終創建了一個類庫調用接口,我只是在我的解決方案中的不同程序間共享這些接口。

這就是我應該做的第一件事,只是懶惰。

+0

我想你會想要_Max int erface實現其他......否則確實沒有任何有效的轉換。不過,你說他們是這樣設計的,所以也許你應該寫一些擴展方法在它們之間進行轉換? – Magus

+2

你說「它必須這樣」。爲什麼?有兩個相同的接口是愚蠢的,尤其是考慮到那些*非常*特定的接口。 –

回答

0

完全蠻力的方式,假設您不擁有IComponentPartIComponentPart_Max並且無法修復其中之一。

創建一個新的界面,您可以控制

interface IComponentPart { 
    string BrandGroup {get; set;} 
    int BrandID {get; set;} 
    // ... 
} 

製作包裝兩種使它們適應你的界面

class IComponentPartWrapper : IComponentPart { 
    private readonly CatelogDL.IComponentPart _underlyingPart; 

    public IComponentPartWrapper(CatelogDL.IComponentPart underlyingPart) { 
     _underlyingPart = underlyingPart 
    } 

    public string BrandGroup { 
     get {return _underlyingPart.BrandGroup;} 
     set {_underlyingPart.BrandGroup = value;} 
    } 

    public int BrandID { 
     get {return _underlyingPart.BrandID ;} 
     set {_underlyingPart.BrandID = value;} 
    } 

    // ... 
} 

class IComponentPart_MaxWrapper : IComponentPart { 
    private readonly GenericCatalogDL.IComponentPart_Max _underlyingPart; 

    public IComponentPartWrapper(GenericCatalogDL.IComponentPart_Max underlyingPart) { 
     _underlyingPart = underlyingPart 
    } 

    public string BrandGroup { 
     get {return _underlyingPart.BrandGroup;} 
     set {_underlyingPart.BrandGroup = value;} 
    } 

    public int BrandID { 
     get {return _underlyingPart.BrandID ;} 
     set {_underlyingPart.BrandID = value;} 
    } 

    // ... 
} 

使您的代碼使用接口現有的接口,幷包住結果從相應的包裝中的任一庫中刪除

public class ComponentParts : IComponentParts 
{ 
    public ComponentParts() { } 
    public ComponentParts(Guid userID, int compID, bool isGeneric) 
    { 
     List<IComponentPart> compParts; 

     if (isGeneric) 
     { 
      compParts = GenericCatalogBL.GenericCatalogManagerBL.GetComponentPartsMax(compID) 
       .Select(x => new IComponentPart_MaxWrapper(x)) 
       .ToList(); 
     } 
     else 
     { 
      compParts = CatalogManagerDL.GetComponentParts(userID, compID) 
       .Select(x => new IComponentPartWrapper(x)) 
       .ToList(); 
     } 

     // ... 
相關問題