Feedback

Instanz per Reflection erstellen

Sprache: C#

Diess Snippet zeigt wie man eine Instanz eines Typs mit Reflection erzeugt. Es werden auch 2 Möglichkeiten gezeigt um einen generischen Typ zu ermitteln. [b]Benötigte Namespaces[/b] System System.Collections.Generic Namespace – Für die Testklassen [b]Testklassen[/b] [code]namespace Namespace { public class Class { public Class() { Console.WriteLine("Parameterloser Konstruktor wurde azufgerufen"); } public class NestedClass { public NestedClass(string a, int b) { Console.WriteLine("Parameterisierter Konstruktor wurde azufgerufen"); } } } }[/code]
//1. Type ermitteln:
//  Möglichkeit 1: Erstellung des Types über einen Direktzugriff auf den Typ
var type1 = typeof(Class);
//  Möglichkeit 2: Erstellung des Types über den Pfad (als String angegeben)
//  Namespaces und Typen werden durch einen Punkt (.) abgetrennt
//  Innere Typen werden durch ein Plus (+) abgetrennt
//  Der Assemblyname wird durch ein Komma (,) abgetrennt angehängt. Wenn der Typ in der aufrufenden Assembly liegt, kann die Assembly weg gelassen werden
var type2 = Type.GetType("Namespace.Class+NestedClass");

//Generischen Typ erzeugen 1
var type3 = typeof(Dictionary<int, string>);
//Generischen Typ erzeugen 2
var type4 = typeof(Dictionary<,>).MakeGenericType(typeof(int), typeof(string));

//2. Instanz erstellen
//  Erstellen über den Parameterlosen Konstruktor:
var instance1 = Activator.CreateInstance(type1);
//  Erstellen über einen Konstruktor der Parameter benötigt:
var instance2 = Activator.CreateInstance(type2, "parameter 1", 2);
//  Erstellen über den Parameterlosen Konstruktor mit angabe des Rückgabetyps (kein Cast erforderlich):
var instance3 = Activator.CreateInstance<Class>();
//Für generische Typen sieht der Aufruf genauso aus
//1. Type ermitteln:
//  Möglichkeit 1: Erstellung des Types über einen Direktzugriff auf den Typ
var type1 = typeof(Class);
//  Möglichkeit 2: Erstellung des Types über den Pfad (als String angegeben)
//  Namespaces und Typen werden durch einen Punkt (.) abgetrennt
//  Innere Typen werden durch ein Plus (+) abgetrennt
//  Der Assemblyname wird durch ein Komma (,) abgetrennt angehängt. Wenn der Typ in der aufrufenden Assembly liegt, kann die Assembly weg gelassen werden
var type2 = Type.GetType("Namespace.Class+NestedClass");

//Generischen Typ erzeugen 1
var type3 = typeof(Dictionary<int, string>);
//Generischen Typ erzeugen 2
var type4 = typeof(Dictionary<,>).MakeGenericType(typeof(int), typeof(string));

//2. Instanz erstellen
//  Erstellen über den Parameterlosen Konstruktor:
var instance1 = Activator.CreateInstance(type1);
//  Erstellen über einen Konstruktor der Parameter benötigt:
var instance2 = Activator.CreateInstance(type2, "parameter 1", 2);
//  Erstellen über den Parameterlosen Konstruktor mit angabe des Rückgabetyps (kein Cast erforderlich):
var instance3 = Activator.CreateInstance<Class>();
//Für generische Typen sieht der Aufruf genauso aus