2009-06-05 9 views
28

Ich muss ein generisches Objekt basierend auf einem Typ erstellen, der in einer Datenbank gespeichert ist. Wie kann ich das erreichen? Der folgende Code (der nicht kompiliert wird) erklärt, was ich meine:Erstellen eines generischen Objekts basierend auf einer Typvariablen

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

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

Ist es möglich, so etwas zu tun?

Dank

Antwort

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

Auch - watch out; Type.GetType(string) prüft nur die ausführende Baugruppe und einige Systembaugruppen; Es scannt nicht alles. Wenn Sie einen für die Assemblierung qualifizierten Namen verwenden, sollten Sie in Ordnung sein. Andernfalls müssen Sie möglicherweise zuerst die Assembly abrufen und dann someAssembly.GetType(string) verwenden.

+0

Hat anrufen müssen, dass Sie einen Konstruktor haben müssen, sind zu schaffen, die keine Argumente übernimmt? – Charlie

+2

@Charlie Sie haben wahrscheinlich im Laufe des Jahres gearbeitet, aber der Vollständigkeit halber, nein, Sie können andere Konstruktoren mit [Activator.CreateInstance] (http://msdn.microsoft.com/en-us/library/wcxyzt4d .aspx) '(Typ, Parameter Objekt [])'. –

6

Was tun, wenn ich das Objekt eine Funktion von myObject wie

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