2016-05-10 6 views
0

Ich bin nur Verweis auf einen früheren Beitrag, da ich nicht ganz das Problem gelöst bekommen konnte. C# convert string to class that has a constructor with string parameterC# Casting-Objekt-Typ zu einem Klassen-Typ, der noch nicht bekannt ist

Ich habe eine Schleife, in der ich versuche, gegebene Zeichenfolgen in Klassenarten zu konvertieren und sie zu instanziieren. Diese Klassen haben Konstruktoren mit einem String-Typ-Parameter, der eine Verbindungszeichenfolge zu einer Datenbank darstellt.

Bis zu diesem Punkt scheint OK. ExampleClass1, ExampleClass2, ExampleClass3 ...

Type type = Type.GetType("ExampleClass1"); 
object instance = Activator.CreateInstance(type, "connection_string_param"); 

Allerdings, wenn ich versuche, die Klassenmethoden über das instance.DoSomething zuzugreifen() Ich erhalte eine Fehler - Objekt keine Definition für DoSomething enthält .... Wenn Ich instanziiere die Klasse regulär, ich kann die Klassenmethoden sehen. Arturo Menchaca schlug vor, seine Hilfe früher zu bewerten, seine Hilfe zu schätzen, aber den 'Objekt'-Typ in' spezifischen Klassen-Typ 'umzuwandeln, würde nicht funktionieren, wenn der Klassentyp noch nicht bekannt ist. Wenn ich versuche (Typ) Instanz, funktioniert es nicht ... Jede Hilfe ist willkommen.

+0

Der ganze Punkt der statischen Typisierung ist, dass der Compiler mindestens die Richtigkeit Ihrer Datentypen mit statischen Informationen überprüfen kann. Sie haben hier eindeutig keine statischen Informationen. Was würde der Compiler also verifizieren? (Und was würde es emittieren?) Andererseits, wenn Sie Typprüfungen komplett überspringen und die Überladungsauflösung an den Laufzeittyp delegieren möchten, verwenden Sie einfach 'dynamic' anstelle von' object'. –

+2

Wahrscheinlich müssen Sie nur ein wenig darüber lesen, welche Schnittstelle ist, dann implementieren Sie eine Schnittstelle für Ihre Klassen. – Evk

+0

http://stackoverflow.com/questions/7598088/purpose-of-activator-creatinstance-with-example –

Antwort

2

DoSomething() ist nicht definiert auf object. Es ist auf Ihrem ExampleClass1 definiert und so weiter.

können Sie es ein dynamic Objekt und rufen sie direkt:

dynamic instance = Activator.CreateInstance(type, "connection_string_param"); 
instance.DoSomething(); 

Oder rufen Sie es durch Reflexion:

object instance = Activator.CreateInstance(type, "connection_string_param"); 
instance.GetType().GetMethod("DoSomething").Invoke(instance, null); 

Allerdings sollten Sie Ihr Design überdenken, da dies nicht a gute Idee zu tun ...

Verwandte Themen