2012-02-13 55 views
0

一個WPF程序我在C#編寫,對後端如下界面:C#協方差課中實施通用接口

public interface CatalogMenu<T> : CatalogItem where T : CatalogItem 
{ 
    void AddCatalogItem(T toAdd); 
    void RemoveCatalogItem(T toRemove); 

    List<T> AvailableCatalogItems { get; } 
} 

我有一個實現該接口三個等級,每一個不同的T問題是我想創建一個List<CatalogMenu<CatalogItem>>來綁定到一個ListView,但View-Model中的這個屬性不能編譯...(thing1,thing2和thing3都實現了與不同的T接口)

public List<CatalogMenu<CatalogItem>> MenuCategories 
    { 
     get 
     { 
      return new List<CatalogMenu<CatalogItem>>(){ 
       ModuleCatalog.thing1, 
       ModuleCatalog.thing2, 
       ModuleCatalog.thing3 
      }; 
     } 
    } 

盡我所願,編譯器不會讓我對待「實施CatalogMenu<T>的類」,其中「T是CatalogEntity」作爲「CatalogMenu<CatalogItem>」。我想通過一個通用接口向用戶展示實現接口的每個類。

如果我遺漏了任何細節,對我有點耐心;在閱讀了最後30分鐘的協變之後,我試着找出解決這個問題的方法。

+0

你試過簡單的鑄造嗎? '返回新列表(){(CatalogMenu )ModuleCatalog.ting1}'? – Alxandr 2012-02-13 02:37:31

+0

@Alxandr:這是行不通的。 – SLaks 2012-02-13 02:40:26

回答

2

.Net不支持協變

如果添加ICatalogMenu<out T>,你將能夠施放任何CatalogMenu到ICatalogMenu<CatalogItem>,並把它變成一個List<ICatalogMenu<CatalogItem>>

可以完成使用普通的非泛型接口或基類相同的效果。

+0

你是男人。謝謝。 – Quanta 2012-02-13 02:49:23

+0

out參數允許我將ICatalogMenu強制轉換爲ICatalogMenu ,但我不能在add和remove方法中使用type參數作爲方法參數,而我的很多代碼依賴於這兩種方法。我想使用一個非泛型接口,但使用它可以使代碼中其他位置的對象根據其特定類型進行序列化。基本上,如果我不使用泛型類,那麼我現在必須重寫大部分程序:( – Quanta 2012-02-13 05:35:23

+0

@Quanta:如果您的類型參數用作參數類型,您嘗試執行的操作實際上不是type-安全。 – SLaks 2012-02-13 06:02:23