2014-03-19 57 views
0

我需要從它的System.Type或它的程序集限定名稱中創建派生類對象。我知道我可以使用類似:C#從System.Type或類名稱創建派生類,然後將其添加到基類的集合

Activator.CreateInstance(derivedClassType) 

的問題是,在創建後,我還需要將這個對象添加到其基類的集合。如果我是正常的創建對象,我這樣做沒有錯誤:

List<BaseClass> myObjects = new List<BaseClass>(); 
BaseClass obj = new DerivedClass(); 
myObjects.Add(obj); 

然而,我無法弄清楚如何做同樣與活化劑代替普通對象的創建。我已經存儲了System.Type和類的名稱,並且確定該類是從基類派生的。有沒有辦法做到這一點?

+0

'myObjects.Add(Activator.CreateInstance(derivedClassType));''或者你是否想使用類型創建列表? – nakiya

回答

2
// create an object of a known type 
var someObject = Activator.CreateInstance(derivedClassType); 

// get the base class of the known type 
var baseType = derivedClassType.BaseType; 

// create a type of a generic list 
Type openListType = typeof(List<>); 

// set the item type of the generic list type to the base stype 
Type baseTypeListType = openListType.MakeGenericType(baseType); 

// create an instance of the list 
dynamic baseTypeList = Activator.CreateInstance(baseTypeListType); 

// add 
baseTypeList.Add(someObject); 

採用dynamic允許你不是在你的代碼中使用實際的基本類型和使用反射的麻煩,節省了你,但你是在危險違反了諸如「我確信所有這些類型都來自同一個基類,所以我不會去檢查這些」的假設。

2

Activator.CreateInstance方法只返回對象類型。您必須手動將其轉換爲基類。

嘗試下面的代碼,

List<BaseClass> myObjects = new List<BaseClass>(); 
BaseClass baseClassObj = Activator.CreateInstance(derivedClassType) as BaseClass; 
if(baseClassObj != null) 
{ 
    myObjects.Add(baseClassObj); 
}