2009-06-05 12 views
28

È necessario creare un oggetto generico basato su un tipo archiviato in un database. Come posso ottenere questo? Il codice seguente (che non verrà compilato) spiega cosa intendo:Creazione di un oggetto generico basato su una variabile di tipo

string typeString = GetTypeFromDatabase(key); 
Type objectType = Type.GetType(typeString); 

//This won't work, but you get the idea! 
MyObject<objectType> myobject = new MyObject<objectType>(); 

È possibile fare questo genere di cose?

Grazie

risposta

53
Type type = typeof(MyObject<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 

anche - attenzione; Type.GetType(string) controlla solo l'assembly in esecuzione e alcuni assembly di sistema; non esegue la scansione di tutto. Se si utilizza un nome qualificato dell'assemblaggio, si dovrebbe andare bene, altrimenti potrebbe essere necessario prendere prima il Assembly e usare someAssembly.GetType(string).

+0

Ha l'oggetto che si sta creando avere un costruttore che non accetta argomenti? – Charlie

+2

@Charlie Probabilmente hai lavorato a questo problema nell'intervallo dell'anno, ma per completezza, no, puoi usare altri costruttori con [Activator.CreateInstance] (http://msdn.microsoft.com/en-us/library/wcxyzt4d .aspx) '(Type, params Object [])'. –

6

Cosa fare se ho bisogno di chiamare una funzione di myObject come

Type type = typeof(MyObject<>).MakeGenericType(objectType); 
object myObject = Activator.CreateInstance(type); 
myobject.SetValue("1212"); 
Problemi correlati