Es kann vorkommen, dass man den "Typ" eines Objekts zur Kompilierzeit nicht kennt, aber eine Instanz des "Typs" erstellen muss. Wie erhält man eine neue Objektinstanz von einem "Typ"?
Die Klasse Activator
innerhalb des Root-Namensraums System
ist ziemlich mächtig.
Es gibt eine Menge Überladungen für die Übergabe von Parametern an den Konstruktor und dergleichen. Sehen Sie sich die Dokumentation an unter:
oder (neuer Pfad)
Hier sind einige einfache Beispiele:
ObjectType instance = (ObjectType)Activator.CreateInstance(objectType);
ObjectType instance = (ObjectType)Activator.CreateInstance("MyAssembly","MyNamespace.ObjectType");
Eine Möglichkeit, dieses Problem zu lösen, ist der Versuch, den parameterlosen Konstruktor des Typs aufzurufen:
public static object GetNewObject(Type t)
{
try
{
return t.GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return null;
}
}
Hier ist derselbe Ansatz, der in einer generischen Methode enthalten ist:
public static T GetNewObject<T>()
{
try
{
return (T)typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { });
}
catch
{
return default(T);
}
}
Wenn es sich um etwas handelt, das in einer Anwendungsinstanz häufig aufgerufen wird, ist es viel schneller, dynamischen Code zu kompilieren und zwischenzuspeichern, anstatt den Aktivator oder ConstructorInfo.Invoke()
zu verwenden. Zwei einfache Optionen für die dynamische Kompilierung sind kompilierte Linq-Ausdrücke oder einige einfache IL
Opcodes und DynamicMethod
. In beiden Fällen ist der Unterschied enorm, wenn Sie in enge Schleifen oder mehrere Aufrufe geraten.