Kann jemand den Activator.CreateInstance()
Zweck im Detail erklären ?
c#
.net
reflection
Tabriz Atayi
quelle
quelle
CreateInstance(Type type)
mit derCreateInstance<T>()
Überlastung übereinstimmt .c#.net
richtige VorgehensweiseObject xyz = Class.forName(className).newInstance();
.Antworten:
Angenommen, Sie haben eine Klasse
MyFancyObject
wie die folgende:Damit können Sie drehen:
In
Verwenden von
und kann dann Sachen machen wie:
Das ist sein Zweck. Es gibt auch viele andere Überladungen, z. B. die Angabe eines
Type
anstelle des Klassennamens in einer Zeichenfolge. Warum Sie so ein Problem haben würden, ist eine andere Geschichte. Hier sind einige Leute, die es brauchten:quelle
String ClassName = "My.Namespace.MyFancyObject";
) aufgenommen habe.obj = (MyFancyObject)Activator.CreateInstance("MyAssembly", ClassName))
aber anstatt mit dem Typ zu gießen. Besetzung mit Typ aus dem Klassennamen? SoType type = Type.GetType(ClassName);obj = (type )Activator.CreateInstance("MyAssembly", ClassName))
?Nun, ich kann Ihnen ein Beispiel geben, warum Sie so etwas verwenden sollten. Stellen Sie sich ein Spiel vor, in dem Sie Ihr Level und Ihre Feinde in einer XML-Datei speichern möchten. Wenn Sie diese Datei analysieren, haben Sie möglicherweise ein solches Element.
Jetzt können Sie die in Ihrer Level-Datei gefundenen Objekte dynamisch erstellen.
Dies ist sehr nützlich, um dynamische Umgebungen aufzubauen. Natürlich ist es auch möglich, dies für Plugin- oder Addin-Szenarien und vieles mehr zu verwenden.
quelle
Mein guter Freund MSDN kann es Ihnen anhand eines Beispiels erklären
Hier ist der Code für den Fall, dass sich der Link oder Inhalt in Zukunft ändert:
quelle
Sie können dies auch tun -
quelle
.Unwrap()
genau funktioniert und wie dies mit anderen Lösungen zusammenhängt?CreateInstance
wo es zurückkehrtSystem.Runtime.Remoting.ObjectHandle
.Ein gutes Beispiel könnte das nächste sein: Zum Beispiel haben Sie eine Reihe von Loggern und Sie können dem Benutzer erlauben, den Typ anzugeben, der zur Laufzeit über die Konfigurationsdatei verwendet werden soll.
Dann:
ODER Ein anderer Fall ist, wenn Sie eine gemeinsame Entitätsfabrik haben, die eine Entität erstellt und auch für die Initialisierung einer Entität durch von DB empfangene Daten verantwortlich ist:
(Pseudocode)
quelle
typeof(loggerType)
führt zuloggerType is a variable and used like a type
Die
Activator.CreateInstance
Methode erstellt eine Instanz eines angegebenen Typs mit dem Konstruktor, der den angegebenen Parametern am besten entspricht.Angenommen, Sie haben den Typnamen als Zeichenfolge und möchten mit der Zeichenfolge eine Instanz dieses Typs erstellen. Sie könnten dafür verwenden
Activator.CreateInstance
:Hier ist ein MSDN-Artikel, in dem die Anwendung ausführlicher erläutert wird:
http://msdn.microsoft.com/en-us/library/wccyzw83.aspx
quelle
new Foo()
. Ich denke, das OP wollte ein realistischeres Beispiel.CreateInstance
ist, wenn Sie den Objekttyp nicht kennen, den Sie zur Entwurfszeit instanziieren möchten. In diesem Beispiel wissen Sie genau, dass es sich um einen Typ handelt,Foo
da Sie ihn als Typ umwandelnFoo
. Sie würden dies niemals tun, weil Sie es einfach tun könnenFoo foo = new Foo()
.Aufbauend auf deepee1 und diesem wird hier beschrieben, wie Sie einen Klassennamen in einer Zeichenfolge akzeptieren und ihn dann zum Lesen und Schreiben in eine Datenbank mit LINQ verwenden. Ich verwende "dynamisch" anstelle des Castings von deepee1, da ich damit Eigenschaften zuweisen kann, mit denen wir jede gewünschte Tabelle dynamisch auswählen und bearbeiten können.
quelle
Warum würdest du es benutzen, wenn du die Klasse bereits kennst und sie besetzen würdest? Warum machst du es nicht einfach auf die altmodische Art und machst die Klasse so, wie du es immer machst? Dies hat keinen Vorteil gegenüber der normalen Vorgehensweise. Gibt es eine Möglichkeit, den Text so zu bearbeiten:
Wenn ich bereits weiß, dass es eine Pizza ist, gibt es keinen Vorteil für:
Aber ich sehe einen großen Vorteil für die Magic-Methode, wenn sie existiert.
quelle
In Verbindung mit der Reflexion fand ich Activator.CreateInstance sehr hilfreich, um das Ergebnis einer gespeicherten Prozedur einer benutzerdefinierten Klasse zuzuordnen, wie in der folgenden Antwort beschrieben .
quelle