This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: C#: Schnell und generisch Objekte erstellen
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Oft müssen Objekte dynamisch bzw. generisch erzeugt werden. In den meisten Fällen wird zu Activator.CreateInstance oder Activator.CreateInstance<> gegriffen. Die Erzeugung über den Activator ist jedoch nicht die schnellste. Einen wesentlich performantereren Ansatz liefern uns die FormatterServices. Hier eine Objekt-Erzeugungs-Klasse, welche beide Varianten implementiert:
publicclass ObjectGenerator
{
public T GenerateObject<T>()
{
return (T)FormatterServices.GetUninitializedObject(typeof(T));
}
public T ActivateObject<T>()
{
return (T)Activator.CreateInstance<T>();
}
}
Erzeugen wir und für jede Variante in einer Schleife 10.000 Objekte, sehen wir eine kleine Überraschung. Zuerst der Code:
ObjectGenerator og = new ObjectGenerator();
Stopwatch sw = new Stopwatch();
Console.Write("Generate Object [Formatter]: ");
sw.Start();
for (int i = 0; i < 10000; i++)
{
TestClass tc = og.GenerateObject<TestClass>();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
sw.Reset();
Console.Write("Generate Object [Activator]: ");
sw.Start();
for (int i = 0; i < 10000; i++)
{
TestClass tc = og.ActivateObject<TestClass>();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadKey();
Und jetzt kommt der eigentliche Clou: Mit Hilfe von FormatterServices.GetUninitializedObject ist es möglich Objekte von Klassen mit privaten Konstruktoren (kein öffentlicher Konstruktor vorhanden!!) zu erstellen. Hier eine Beispielklasse:
publicclass TestClass
{
private TestClass() { }
publicstring GetMessage()
{
return"This is a message";
}
}
Diese kann mit GetUninitializedObject instantiiert werden, wogegen CreateInstance eine MissingMethodException wirft und uns darauf aufmerksam macht:
Für dieses Objekt wurde kein parameterloser Konstruktor definiert.
Einsatzmöglichkeiten dafür werden sich sicherlich für manche finden.