2011-08-15 57 views
3

我已經花了幾個小時來試圖找到答案,我可能無法正確說出問題,但這並沒有幫助。從本質上講,我有一個抽象類:如何創建從具有不同類型的相同泛型類繼承的對象列表?

public abstract class GenericType<T> 
{ ... } 

和一堆類,繼承它:

public class AType: GenericType<A> 
{ ... } 

public class BType: GenericType<B> 
{ ... } 

... 

最後,我有希望遏制,從GenericType繼承的事情的清單另一個類,不管T的值是什麼,即Atypes,BTypes等等。

我的第一次嘗試是使用List<GenericType>List<GenericType<Object>>,但niether給了我任何喜悅。

如何,我應該會對此有什麼建議?非常感謝!

回答

8

所以,如果我理解正確的話,你想是這樣的:

List<GenericType> 

它可以包含的AType任何情況下,BType等,您只需通過使GenericType<T>本身的一個子類做到這一點GenericType

public class GenericType { } 
public class GenericType<T> : GenericType { } 
public class AType : GenericType<int> { } 
public class BType : GenericType<int> { } 

然後你可以堅持任何實例爲List<GenericType>

+0

難以置信,我沒有想到 - 非常感謝,非常感謝! – yaztheblack

3

如果GenericType<T>實現非通用接口IAmNotGeneric,那麼這兩個AType S和BType小號可以添加到一個List<IAmNotGeneric>

public abstract class GenericType<T> : IAmNotGeneric 

相同的原理可以適用於非通用的抽象基類。

public abstract class GenericType<T> : NonGenericType 
0

你的意思是,每個派生類型的實例的列表?

Assembly.GetExecutingAssembly().GetTypes 
    .Where(type => type.BaseType.IsGenericType && type.BaseType.GetGenericTypeDefinition() == typeof(GenericType<>)) 
    .ToList(). 
    .ForEach(type => list.Add(Activator.CreateInstance(type))); 
10

如何創建受約束,從不同類型參數的構造相同的通用類繼承的對象的一個​​泛型列表?

這是不可能在C#類型系統;您只能列出實際類型,而不是像「List<U>」這樣的「類型模式」,其中對於某些未指定的T,U必須爲Foo<T>

要明白爲什麼它是不可能的,讓我們假設猜想,這是可能的。我們將「類型模式」註釋爲問號:

class Stack<T> { ... } 
... 
List<Stack<?>> listOfStacks = new List<Stack<?>>(); 
listOfStacks.Add(new Stack<int>()); 
listOfStacks.Add(new Stack<Giraffe>()); 

好的,太好了。 現在你打算如何處理堆棧列表?你不能做安全任何有涉及堆棧的類型參數堆棧:

listOfStacks[0].Push("hello"); 

這應在編譯時失敗,因爲在插槽零堆棧整數,而不是字符串堆棧。 編譯器如何知道?編譯器無法知道這一點。通過允許這個特性,你基本上破壞了編譯器鍵入檢查程序的能力。

回答「我該如何做這件不可能的事?」知道爲什麼你想做不可能的事情是有幫助的。而不是試圖做這個不可能的事情告訴我們你真的想要做什麼,看看是否有人能解決真正的問題。

+0

我同意你答案的要旨,但這不是真的,「你不能安全地做任何事情」。例如,使用這種功能可以安全地訪問Count屬性,或調用Clear方法。 – kvb

+0

@kvb:好點。 –

+0

@Tejs給出了一個似乎可行的答案。 爲了澄清,每個實現都會覆蓋一個方法,該方法接受一個T類型的對象並返回一個bool - List用於循環運行該方法。 – yaztheblack

相關問題