2013-11-24 92 views
2

我有一個抽象類A和實現B和C.我也有一個數據庫,它存儲有關A對象的信息。該表有一個名爲「Name」的列,用於確定是使用數據構造B還是C。使用非默認構造函數創建運行時類型的對象

public abstract class A { } 

public class B,C : A 
{ 
    public B,C(TableData data) 
    { 
     //Do Stuff. 
    } 
} 

public class TableData 
{ 
    string Name { get; set; } 
} 

現在,如果名稱是「香蕉」,我希望這可以創建一個B的實例;如果是「胡蘿蔔」我想這對創建C的一個實例:

A myObj = { Reflection? } 

當反思莫名其妙採用B或C的構造函數,並指定這個新創建的對象MyObj中。我已經調查使用反射,但大多數方法有允許使用非默認的構造函數是非常複雜的,並採取參數我從來沒有合作過前:

http://msdn.microsoft.com/en-us/library/System.Activator.CreateInstance(v=vs.110).aspx http://msdn.microsoft.com/en-us/library/dd384354.aspx

有沒有更好的如何做到這一點?如果不是,我如何使用第二個鏈接來動態分配這種類型?

如果有一些辦法簡單地做到這一點:

CreateInstance("Namespace.Type", [ ConstructorParam1, ConstructorParam2, ... ]) 

這就是我所需要的。

回答

4

如果你期望有是一個參數,需要一個TableData,那麼這很簡單:

Type type = Type.GetType(qualifiedName); 
TableData tableData = ... 
A obj = (A)Activator.CreateInstance(type, tableData); 

注意到qualifiedName應包括裝配信息;如果沒有,你要首先解決的是 - 也許是:

Type type = typeof(A).Assembly.GetType(fullName); 

其中B/C等在同一組件A,並在fullName"Namespace.B"或相似。

+0

謝謝,第二個完美的工作!是否值得它存儲與第一個一起使用的程序集信息,還是使用方法#2檢索它仍然很好嗎? – jokulmorder

+0

@jokulmorder如果你確定它會一直在那個裝配中,那麼第二種方法是好的 –

相關問題