Nehmen Sie die folgende Klasse als Beispiel:
class Sometype
{
int someValue;
public Sometype(int someValue)
{
this.someValue = someValue;
}
}
Ich möchte dann eine Instanz dieses Typs mithilfe von Reflection erstellen:
Type t = typeof(Sometype);
object o = Activator.CreateInstance(t);
Normalerweise funktioniert dies. Da SomeType
jedoch kein parameterloser Konstruktor definiert wurde, löst der Aufruf von Activator.CreateInstance
eine Ausnahme vom Typ MissingMethodException
mit der Meldung " Kein parameterloser Konstruktor für dieses Objekt definiert " aus. Gibt es eine alternative Möglichkeit, eine Instanz dieses Typs weiterhin zu erstellen? Es wäre ein bisschen blöd, allen meinen Klassen parameterlose Konstruktoren hinzuzufügen.
FormatterServices.GetUninitializedObject
Nicht initialisierte Zeichenfolge darf nicht erstellt werden. Möglicherweise erhalten Sie eine Ausnahme:System.ArgumentException: Uninitialized Strings cannot be created.
Bitte beachten Sie dies.Antworten:
Ich stellte ursprünglich diese Antwort hier , aber hier ist ein Nachdruck , da dies nicht genau die gleiche Frage ist , hat aber die gleiche Antwort:
FormatterServices.GetUninitializedObject()
erstellt eine Instanz, ohne einen Konstruktor aufzurufen. Ich habe diese Klasse mit Reflector gefunden und einige der wichtigsten .Net-Serialisierungsklassen durchsucht.Ich habe es mit dem folgenden Beispielcode getestet und es sieht so aus, als ob es großartig funktioniert:
quelle
Verwenden Sie diese Überladung der CreateInstance-Methode:
Siehe: http://msdn.microsoft.com/en-us/library/wcxyzt4d.aspx
quelle
Beim Benchmarking war die Leistung
(T)FormatterServices.GetUninitializedObject(typeof(T))
langsamer. Gleichzeitig würden kompilierte Ausdrücke zu erheblichen Geschwindigkeitsverbesserungen führen, obwohl sie nur für Typen mit Standardkonstruktor funktionieren. Ich habe einen hybriden Ansatz gewählt:Dies bedeutet, dass der Erstellungsausdruck effektiv zwischengespeichert wird und nur beim ersten Laden des Typs eine Strafe verursacht. Behandelt auch Werttypen auf effiziente Weise.
Nennen:
Beachten Sie, dass dies
(T)FormatterServices.GetUninitializedObject(t)
für die Zeichenfolge fehlschlägt. Daher ist eine spezielle Behandlung für Zeichenfolgen vorhanden, um leere Zeichenfolgen zurückzugeben.quelle
Gute Antworten, aber auf dem Dot Net Compact Framework unbrauchbar. Hier ist eine Lösung, die auf CF.Net funktioniert ...
quelle