Objekte erzeugen wenn man nur einen Type hat: Beispiel für Reflection


Thomas Wölfer
Thomas Wölfer

12. August 2004


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.