Objekte erzeugen wenn man nur einen Type hat: Beispiel für Reflection
Mit Reflection kann man nette Dinge tun. Angenommen, man hat zur Laufzeit nur einen 'Type' - braucht aber eine Instanz: Genau sowas kann man mit Reflection tun.
Zunächst ermittelt man dazu den Konstruktor zum Type. Das geht mit oder ohne Parameter - im einfachsten Fall ermittelt man eben den Konstruktor ohne Parameter. Den ruft man dann auf - schon hat man ein Objekt.
Mit diesem Basiswissen kann man nun auch eine neue Instanz eines Objektes erzeugen, wenn man nur ein 'object' hat: Denn dessen Typ kann man ja ermitteln. Beides zusammen ergibt dann diese Beispielklasse:
public sealed class Creator{
private Creator() {}
public static object CreateFromType( Type t)
{
ConstructorInfo f = t.GetConstructor( Type.EmptyTypes);
return f.Invoke( Type.EmptyTypes);
}
public static object CreateFromTemplate( object o)
{
return CreateFromType( o.GetType());
}
}
Mit dieser Klasse ausgestattet kann man nun lustigen Code schreiben. Zum Beispiel diesen, bei dem eine Form erzeugt wird ohne das man irgendwo ein 'new' findet....
static void Main(string[] args){
Form f = Creator.CreateFromType( typeof( Form)) as Form;
Button b1 = Creator.CreateFromType( typeof( Button)) as Button;
b1.Text = "Button1";
f.Controls.Add( b1);
Button b2 = Creator.CreateFromTemplate( b1) as Button;
b2.Text = "Button2";
b2.Location = new System.Drawing.Point( 100, 10);
f.Controls.Add( b2);
f.ShowDialog();
}
Achtung: Reflection ist l a n g s a m. Es spricht nichts dagegen Reflection zu verwenden - man muss sich nur im klaren sein das Reflection ein Performance-Killer ist. Kommt es nicht auf die Performance an, dann ist es aber ein wunderbares Tool.