2009-06-10 50 views
4

我有兩個接口,通用和非通用有一個傳承層次:如何枚舉實現通用接口的所有項目?

public interface IGenericRelation<TParent, TChild> : IRelation 

public interface IRelation 

通用一個由動態加載幾個服務器控件實現,我想枚舉的控件的集合實現這個接口。我可以做以下

foreach (IRelation relationControl in this.uiPlhControls.Controls.OfType<IRelation) 
    { ... } 

但我真的希望能夠做的是...

foreach (IGenericRelation<,> relationControl in this.uiPlhControls.Controls.OfType<IGenericRelation<,>) 
    { ... } 

,然後可以用它提供的各類使用relationControl那麼我可以訪問IGenericRelation上的強類型屬性。不幸的是,這是不可能的,因爲它似乎我不能省略類型參數。

有沒有人知道一種方法來枚舉實現通用接口,以防止我必須寫幾個循環而不是一個循環的控件?也許使用反射?

+0

我似乎記得一個早期的Linq樣本,但是當我來看linq時,我找不到它。我正在看這個空間。 。 。 – 2009-06-10 15:19:04

回答

3

這是不可能的,因爲IGenericRelation<T,F>是與IGenericRelation<G,I>完全不同的類型。如果您需要訪問所有IGenericRelation共有的特定屬性,那麼您需要在IRelation圖層實現它們,或者引入實現這些屬性的IRelationIGenericRelation<,>之間的第三個接口。原因在於編譯器無法推斷出它希望實現哪些類型。

最簡單的方法是在較高級別(IRelation或中間界面)上實現您的兩個屬性object,並在IGenericRelation<,>級別強制鍵入。

1

您試圖訪問哪些強類型屬性?如果它們是強類型的,因爲它們是泛型的輸入類型,那麼如果不在foreach循環中提供這些類型,就無法訪​​問它們。如果它們是強類型的,但是而不是與提供的類型相關,可以將它們移動到IRelation類中嗎?

這樣會更有意義有一個代碼示例 - 假設你的類是這樣的:

public IRelation 
{ 
    public string RelationshipType { get; set; } 
} 

public IGenericRelation<TParent, TChild> : IRelation 
{ 
    public TParent Parent { get; set; } 
    public TChild Child { get; set; } 
} 

如果您的列表包含一個IGenericRelation<Foo, Bar>和一個IGenericRelation<Fizz, Buzz>無法枚舉並同時獲得回來不知道其具體類型,你正在尋找:(請注意,我還必須從你的示例代碼在foreach改變relationControl的類型,這樣可能的使用有一定的道理)

//Theoretical, non-compiling example.... 
foreach (IGenericRelation<,> relationControl in this.uiPlhControls.Controls.OfType<IGenericRelation<,>>) 
{ 
    //This wouldn't work for type IGenericRelation<Fizz, Buzz> 
    relationControl.Parent.FooProperty = "Wibble"; 

    //You would be able to access this, but there is no advantage over using IRelation 
    relationControl.RelationshipType = "Wibble"; 
} 


從根本上說也可以是認爲.NET泛型一樣的C++模板類(我知道的實現是不同的,但在這方面的效果是一樣的)的幫助。想象一下,在編譯時檢查所有代碼是否使用了IGenericRelation類,具體而言,非泛型類是通過對TParent和TChild關鍵字執行查找並用請求的類型替換它們來創建的。由於兩個創建的類與其他任何兩個.NET類都是分離的,因此請求「所有以此模板開始的類」是沒有意義的,所以您可以做的最好的方法是查找共享基類或接口 - 在這種情況下IRelation。

+0

是的,它們是通用接口的輸入類型。 – 2009-06-10 15:19:35

相關問題