2013-03-15 86 views
0

的名單是否有可能有一般類型化項目,集合給出下面的代碼:創建一般類型的項目

public abstract class AGeneric<T> { 
internal virtual List<T> MyList { get; set; } 
} 


public class LibA<T> : AGeneric<T> { 
internal override List<T> MyList { get; set; } 
} 

public class LibB<T> : AGeneric<T> { 
internal override List<T> MyList { get; set; } 
} 

public class LibC<T> : AGeneric<T> { 
internal override List<T> MyList { get; set; } 
} 
//. 
//. 
//. 
Main { 
    List<AGeneric> test = new List<AGeneric>(); //error - requires type; 
    List<BGeneric> test2 = new List<BGeneric>(); 
    test2.first(). 


} 

public abstract class BGeneric { 
internal virtual List<T> MyList { get; set; } //cant use T to provide implementation  
} 


public class LibD<T> : BGeneric { 
internal override List<T> MyList { get; set; } 
} 

public class LibE<T> : BGeneric { 
internal override List<T> MyList { get; set; } 
} 

public class LibF<T> :BGeneric { 
internal override List<T> MyList { get; set; } 
} 

的目標是有不同類型的列表,因爲從抽象類來實現類的目的是確定並返回一個強類型對象的數組。

+3

'AGeneric'不是一個類型;一個泛型類型實際上並沒有定義一個類型,直到你給它一個類型參數。你的意思是說'力霸''延伸AGeneric '? – 2013-03-15 20:51:26

+0

創建一個界面可以讓您在列表中保留的任何內容都可以實現嗎? – 2013-03-15 20:51:54

+0

@EricLippert,力霸並基於類的定義擴展AGeneric 現在,我已經固定的代碼。 – sammarcow 2013-03-15 20:55:24

回答

0

不,但是你可以做一個非泛型與運行時類型的列表。這個例子基本上是你追求的不過因爲AGeneric需要一個泛型參數就會產生一個運行時錯誤(例如僅1)。如果你能重組你有什麼不會是一個通用的,那麼你可以適應這個工作:

Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>)); 
var answer = Activator.CreateInstance(listType); 

以相同的方式,如果你必須有AGeneric可以使列表與它的運行時類型

int myRunTimeVariable = 0; 
Type MyType = myRunTimeVariable.GetType(); 

Type listType = typeof(List<>).MakeGenericType(typeof(AGeneric<>).MakeGenericType(MyType)); 
var answer = Activator.CreateInstance(listType); 

answer將在這種情況下List<AGeneric<int>>類型。但它仍然不是一個List<AGeneric<>>