Создать список типов переменных

19

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

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

Тип a имеет переменную. Как создать список типа переменной?

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

public IList createListOfMyType(Type myType)
{
     return new List<myType>();
}
    
задан Jan 22.03.2010 в 15:59
источник
  • Убедитесь, что нет неисправного дизайна, так как это пахнет как один. –  Dykam 22.03.2010 в 16:32

3 ответа

14

Вы можете использовать Reflections, вот пример:

    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[] {});
    
ответ дан Andrew Bezzub 22.03.2010 в 16:04
источник
  • Проблема в том, что мы не знаем, что myType - typeof (int), поэтому ваш последний оператор не может быть List <int>, нам бы хотелось что-то вроде Liar <myType>, но, конечно, это не может сделайте. Чтобы создать экземпляр, мы должны использовать System.Activator.CreateInstance (myType). Но опять же, возвращаемое значение, если объект типа myType. И вы должны использовать System.Type, чтобы узнать о методах / свойствах / интерфейсах и т. Д. –  Harald Coppoolse 11.09.2013 в 16:22
  • Это можно сделать с помощью generics: List <T> CreateMyList <T> (). Внутри этого метода вы можете: Тип myType = typeof (T); а затем все, что указано выше. Вы могли бы использовать такой метод: List <int> list = CreateList <int> () –  Andrew Bezzub 12.09.2013 в 00:30
36

Что-то вроде этого должно работать.

public IList createList(Type myType)
{
    Type genericListType = typeof(List<>).MakeGenericType(myType);
    return (IList)Activator.CreateInstance(genericListType);
}
    
ответ дан smencer 22.03.2010 в 16:13
источник
  • Спасибо, это решило мою проблему. –  Jan 23.03.2010 в 08:20
  • Мне пришлось немного поиграть с этим, прежде чем я заработал. Я новичок в использовании типа, так что вот фрагмент кода, который другие люди могут найти полезным, когда вы вызываете этот метод createList из основного или какого-либо другого метода: string [] words = {"stuff", "things", " wordz "," misc "}; var shtuff = createList (words.GetType ()); –  kayleeFrye_onDeck 04.02.2015 в 18:28
  • Я понимаю, что это старый, но @Jan, он решил эту проблему, и он должен быть отмечен как ответ. @kayleeFrye_onDeck вы также можете просто сделать typeof (string []) –  182764125216 12.08.2016 в 22:44
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);
    }
    
ответ дан Cedric 09.03.2018 в 15:47
источник