Gibt es eine Möglichkeit, eine Instanz einer Klasse basierend auf der Tatsache zu erstellen, dass ich den Namen der Klasse zur Laufzeit kenne. Grundsätzlich hätte ich den Namen der Klasse in einer Zeichenfolge.
c#
.net
instantiation
system.type
PeteT
quelle
quelle
Antworten:
Schauen Sie sich die Activator.CreateInstance- Methode an.
quelle
var driver = (OpenQA.Selenium.IWebDriver)Activator.CreateInstance("WebDriver", "OpenQA.Selenium.Firefox.FirefoxDriver").Unwrap();
Es ist ziemlich einfach. Angenommen, Ihr Klassenname ist
Car
und der Namespace istVehicles
, und übergeben Sie den Parameter,Vehicles.Car
der ein Objekt vom Typ zurückgibtCar
. Auf diese Weise können Sie jede Instanz einer beliebigen Klasse dynamisch erstellen.Wenn sich Ihr vollständig qualifizierter Name (dh
Vehicles.Car
in diesem Fall) in einer anderen Assembly befindet, ist der NameType.GetType
null. In solchen Fällen haben Sie eine Schleife durch alle Baugruppen und finden dieType
. Dafür können Sie den folgenden Code verwendenWenn Sie nun einen parametrisierten Konstruktor aufrufen möchten, gehen Sie wie folgt vor
anstatt
quelle
dynamic
Code verwenden - siehe stackoverflow.com/a/2690661/904521 )strFullyQualifiedName
mitstr
,fullyQualifiedName
wird die Arbeit machen.str
wird als Teil der Namenskonvention für Variablen verwendet. Bestimmte Organisationen und Projekte bestehen darauf, dies zu befolgen, daher habe ich verwendet. Wenn Sie in bestimmten Organisationen / Projekten gearbeitet hätten, wissen Sie dies. Wie Sie sagten, auch ohnestr
wird es den Job machen :) @MehdiDehghaniIch habe diese Methode erfolgreich angewendet:
Sie müssen das zurückgegebene Objekt in den gewünschten Objekttyp umwandeln.
quelle
Wahrscheinlich hätte meine Frage spezifischer sein sollen. Ich kenne tatsächlich eine Basisklasse für den String, also löste ich sie durch:
Die Activator.CreateInstance-Klasse verfügt über verschiedene Methoden, um dasselbe auf unterschiedliche Weise zu erreichen. Ich hätte es auf ein Objekt werfen können, aber das Obige ist für meine Situation am nützlichsten.
quelle
Ich weiß, dass ich zu spät zum Spiel komme ... aber die Lösung, nach der Sie suchen, könnte die Kombination der oben genannten sein und die Verwendung einer Schnittstelle zum Definieren öffentlich zugänglicher Aspekte Ihrer Objekte.
Wenn dann alle Ihre Klassen, die auf diese Weise generiert würden, diese Schnittstelle implementieren, können Sie sie einfach als Schnittstellentyp umwandeln und mit dem resultierenden Objekt arbeiten.
quelle
Um eine Instanz einer Klasse aus einem anderen Projekt in der Lösung zu erstellen, können Sie die Assembly mit dem Namen einer beliebigen Klasse (z. B. BaseEntity) anzeigen lassen und eine neue Instanz erstellen:
quelle
Wenn Sie beispielsweise Werte verschiedener Typen in einem Datenbankfeld (als Zeichenfolge gespeichert) speichern und ein anderes Feld mit dem Typnamen (dh Zeichenfolge, bool, int, MyClass) haben, können Sie aus diesen Felddaten möglicherweise Erstellen Sie mit dem obigen Code eine Klasse eines beliebigen Typs und füllen Sie sie mit dem Wert aus dem ersten Feld. Dies hängt natürlich vom Typ ab, den Sie speichern, und verfügt über eine Methode zum Parsen von Zeichenfolgen in den richtigen Typ. Ich habe dies oft verwendet, um Benutzereinstellungen in einer Datenbank zu speichern.
quelle
Warum willst du so einen Code schreiben? Wenn eine Klasse 'ReportClass' verfügbar ist, können Sie diese wie unten gezeigt direkt instanziieren.
Der Code
ReportClass report = (ReportClass)Activator.CreateInstance(Type.GetType(reportClass));
wird verwendet, wenn Sie nicht über die erforderliche Klasse verfügen, aber eine Methode dynamisch instanziieren und / oder aufrufen möchten.Ich meine, es ist nützlich, wenn Sie die Assembly kennen, aber während Sie den Code schreiben, steht Ihnen die Klasse nicht zur
ReportClass
Verfügung.quelle