How to create a generic list using reflection

Reflection is a very powerful feature which allows you to do lots of crazy things.
But sometimes you want to create a generic class which can be really annoying if you dont know how to do it.

If you try to do it as usual then you will receive an exception.
An example would be

var myType = typeof (double);
var list = (List<myType>) Activator.CreateInstance(typeof (List<myType>), null);

The compiler tells you that a type or namespace is expected and not myType!

 

In order to do that you can use the MakeGenericType method to add the generic types to the List and after that you can create the instance

var myGenericType = typeof(List<>).MakeGenericType(new []{typeof(double)});
var myList = (List<double>)Activator.CreateInstance(myGenericType);

Note that the MakeGenericType method only creates the type which then is used to create an object in the next line

Advertisements
  1. In welchem Szenario braucht man sowas?

    Wäre sowas

    public class PluginManager where T : class
    {
    List a = new List()
    }
    nicht einfacher und sicherer?

    Jedenfalls weiß ich jetzt wie man sowas mittels Reflection löst 🙂

    lg

      • michlG
      • August 7th, 2010

      Eine generische Liste mittels Reflection zu erstellen braucht man nicht jeden Tag aber, es ist ab und zu doch nützlich wenn man z.B. einen Typ erst zur Laufzeit kennt.
      Soweit wie möglich sollte man den Ansatz wie in deinem Beispiel verwenden (aber mit einer List anstatt einer normalen List damit das generisch wird / bleibt.
      In meinem Fall habe ich einen Mapper geschrieben der Daten von verschiedenen Quellen untereinander synchron hält.
      Dabei gibt es auch Konvertierungsfunktionen usw. Dabei wird z.B. ein ABC[] ausgelesen und ich will diesen in eine List mappen, dazu habe ich das dann gebraucht 🙂
      Das Ganze ist etwas umfangreicher geworden deshalb konnte ich nicht den normalen Weg mit den Generics gehen.

      Grüsse

    • Thomas Sczyrba
    • December 14th, 2010

    Hallo Michl!
    Finde deine Blog Klasse. Vielleicht solltest Du den auch bei http://blogs.dotnetgerman.com/ anmelden?

    Nun zu meiner Frage: Nehmen wir mal an du hast in einem String den Datentypen vorliegen. Wie kann man dann mit deiner genannten Funktionalität folgendes erreichen?

    string MyStringType = “DateTime”
    Test X = new Test

    Class Test{}

      • michlG
      • December 15th, 2010

      Hallo,

      vielen Dank für das Lob 🙂
      Du kannst den Typen laden indem du die Type.GetType(“System.DateTime”) Methode verwendest.
      Danach kannst du es gleich machen wie in diesem Beispiel

      var myGenericType = typeof(Test<>).MakeGenericType(new[] { Type.GetType("System.DateTime") });
            var myTest = (Test<DateTime>)Activator.CreateInstance(myGenericType);
      

      Grüße Michael

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: