2010-03-22 6 views
19

J'essaie de créer une liste d'un certain type.Créer une liste de type de variable

Je veux utiliser la notation de la liste, mais tout ce que je sais est un "System.Type"

Le type A ont est variable. Comment puis-je créer une liste d'un type de variable?

Je veux quelque chose de similaire à ce code.

public IList createListOfMyType(Type myType) 
{ 
    return new List<myType>(); 
} 
+2

Assurez-vous qu'il n'y a pas de conception défectueuse, car cela ressemble à un. – Dykam

Répondre

14

Vous pouvez utiliser réflexions, voici un échantillon:

Type mytype = typeof (int); 

    Type listGenericType = typeof (List<>); 

    Type list = listGenericType.MakeGenericType(mytype); 

    ConstructorInfo ci = list.GetConstructor(new Type[] {}); 

    List<int> listInt = (List<int>)ci.Invoke(new object[] {}); 
+0

Le problème est que nous ne connaissons pas le myType est typeof (int), donc votre dernière déclaration ne peut pas être Liste , nous aimerions quelque chose comme Liar , mais bien sûr, cela ne peut être fait. Pour créer l'instance, nous devons utiliser System.Activator.CreateInstance (myType). Mais là encore, la valeur de retour si un objet de type myType. Et vous devez utiliser le System.Type pour connaître les méthodes/propriétés/interfaces etc. –

+0

Cela peut être fait en utilisant des génériques: Liste CreateMyList (). À l'intérieur de cette méthode, vous pouvez faire: Tapez myType = typeof (T); et ensuite tout comme ci-dessus. Vous seriez en mesure d'utiliser la méthode comme ceci: Liste list = CreateList () –

33

Quelque chose comme cela devrait fonctionner.

public IList createList(Type myType) 
{ 
    Type genericListType = typeof(List<>).MakeGenericType(myType); 
    return (IList)Activator.CreateInstance(genericListType); 
} 
+0

Merci, cela a résolu mon problème. – Jan

+0

J'ai dû bricoler avec ça un peu avant de le faire fonctionner. Je suis un débutant total à l'aide de Type, donc voici un extrait de code que d'autres personnes trouveront utile lorsque vous appelez cette méthode createList depuis votre Main ou une autre méthode: string [] words = {"stuff", "things" , "wordz", "misc"}; var shtuff = createList (words.GetType()); –

+1

Je me rends compte que c'est vieux, mais @Jan, celui-ci a résolu votre problème, il devrait être marqué comme réponse. @kayleeFrye_onDeck vous pouvez également faire 'typeof (string [])' – 182764125216

0

Merci! C'était une aide précieuse. Voici ma mise en œuvre pour Entity Framework:

public System.Collections.IList TableData(string tableName, ref IList<string> errors) 
    { 
     System.Collections.IList results = null; 

     using (CRMEntities db = new CRMEntities()) 
     { 
      Type T = db.GetType().GetProperties().Where(w => w.PropertyType.IsGenericType && w.PropertyType.GetGenericTypeDefinition() == typeof(System.Data.Entity.DbSet<>)).Select(s => s.PropertyType.GetGenericArguments()[0]).FirstOrDefault(f => f.Name == tableName); 
      try 
      { 
       results = Utils.CreateList(T); 
       if (T != null) 
       { 
        IQueryable qrySet = db.Set(T).AsQueryable(); 
        foreach (var entry in qrySet) 
        { 
         results.Add(entry); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       errors = Utils.ReadException(ex); 
      } 
     } 

     return results; 
    } 

    public static System.Collections.IList CreateList(Type myType) 
    { 
     Type genericListType = typeof(List<>).MakeGenericType(myType); 
     return (System.Collections.IList)Activator.CreateInstance(genericListType); 
    } 
Questions connexes