2010-03-22 3 views
19

Я пытаюсь создать список определенного типа.Создать список переменных типа

Я хочу использовать обозначение списка, но все, что я знаю, это «System.Type»

типа А есть переменный. Как создать список типа переменной?

Я хочу что-то похожее на этот код.

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

Убедитесь, что нет неисправного дизайна, так как это пахнет как один. – Dykam

ответ

14

Вы можете использовать Размышления, вот пример:

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

Проблема в том, что мы не знаем, что myType - typeof (int), поэтому ваш последний оператор не может быть List , нам бы хотелось что-то вроде Liar , но, конечно, это невозможно. Чтобы создать экземпляр, мы должны использовать System.Activator.CreateInstance (myType). Но опять же, возвращаемое значение, если объект типа myType. И вы должны использовать System.Type, чтобы узнать о методах/свойствах/интерфейсах и т. Д. –

+0

Это можно сделать с помощью дженериков: Список CreateMyList (). Внутри этого метода вы можете: Тип myType = typeof (T); а затем все, что указано выше. Вы могли бы использовать такой метод: Список list = CreateList () –

33

Что-то, как это должно работать.

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

Спасибо, это решило мою проблему. – Jan

+0

Мне пришлось немного поиграть с этим, прежде чем я заработал. Я новичок в использовании типа, поэтому здесь приведен фрагмент кода, который другие люди могут найти полезным, когда вы вызываете этот метод createList из основного или какого-либо другого метода: string [] words = {"stuff", "things" , "wordz", "misc"}; var shtuff = createList (words.GetType()); –

+1

Я понимаю, что это старый, но @Jan, он решил эту проблему, он должен быть отмечен как ответ. @kayleeFrye_onDeck вы также можете просто сделать 'typeof (string [])' – 182764125216

0

Спасибо! Это была большая помощь. Вот моя реализация для 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); 
    } 
Смежные вопросы