2010-12-22 11 views
0

Das sollte einfach sein, aber ich kann nirgends finden, dass mir das sagt, wie das geht. Ich habe eine Klasse, es ist in der gleichen DLL wie die, die ich benutze, um dies zu tun.Instanziieren einer Klasse in derselben DLL mithilfe von Reflektion basierend auf dem Klassennamen?

Alles, was ich tun möchte, ist etwas wie.

thing.InstanceClass("ClassName"); 

Ich mag würde, dies zu tun, ohne dabei:

Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll"); 

Und das ist, weil die Klassen würde ich Instanz wie Reflexion verwenden, sind in der gleichen Baugruppe.

Antwort

5
Type instanceType = Type.GetType("SomeNamespace.SomeType"); 
object instance = Activator.CreateInstance(instanceType); 

Sie können es durch Type.GetType(...) lösen, wenn die Baugruppe bereits in die AppDomain geladen wird. Wenn Sie die Baugruppe benötigen, können Sie Assembly.GetEntryAssembly oder möglicherweise typeof(SomeType).Assembly verwenden, wobei sich SomeType in Ihrer Zielbaugruppe befindet.

+2

'Type.GetType (Zeichenfolge)' sucht nicht in jeder Assembly in der AppDomain nach Typen. [Von MSDN] (http://msdn.microsoft.com/en-us/library/w3f99sx1.aspx): * "Wenn typeName den Namespace, aber nicht den Assemblynamen enthält, durchsucht diese Methode nur die Assembly des aufrufenden Objekts und Mscorlib. dll, in dieser Reihenfolge. "* So lange dieser Code in die Assembly kompiliert wird, wo' SomeNamespace.SomeType' existiert, wird dies funktionieren. Sonst wird es nicht. – cdhowie

0

Wenn es bekannt ist (Bezug genommen wird, nicht COM etc.) geben Sie in Ihrem Projekt, dann der beste Weg ist, um die stark typisierte CreateInstance Funktion zu verwenden:

MyClass instance = Activator.CreateInstance<MyClass>(); 

Dies wird viel von Leistungskosten sparen, da Es gibt kein Boxing/Unboxing.

Verwandte Themen