的例如,如果我理解正確的話,你希望它有不同類型的Output
小號Foo
對象的列表,對不對?由於這些輸出具有不同的類型,因此無論如何您都必須使用強制轉換。
但是,下面的想法可能會有所幫助。你怎麼樣聲明一個名爲IFoo
非通用接口:¹
public interface IFoo
{
object Output { get; }
}
,然後實現它在你的抽象類:
abstract class Foo<T> : IFoo
{
abstract T Output { get; }
object IFoo.Output { get { return Output; } }
}
然後你就可以申報IFoo
個清單:
class Bar
{
List<IFoo> Foos;
}
訪問這些foos時,您可以通過界面檢索輸出爲對象:
var myObject = Foos[0].Output; // type ‘object’
,或者你可以嘗試去發現真正的類型,如果你知道它只能是一些特定類型之一:
if (Foos[0] is Foo<string>)
var myString = ((Foo<string>) Foos[0]).Output; // type ‘string’
你甚至可以做基於類型過濾,例如:
// Type ‘IEnumerable<string>’ (rather than ‘IEnumerable<object>’)!
var stringFoos = Foos.OfType<Foo<string>>().Select(f => f.Output);
¹您也可以讓這個所謂的Foo
抽象基類和具有Foo<T>
從中獲得。在這種情況下,您需要使用new
關鍵字標記Foo<T>.Output
,並使用base.Output
訪問抽象基礎成員。
完全重複:http://stackoverflow.com/questions/353126/c-multiple-generic-types-in-one-list – GameZelda 2010-09-01 01:30:56