none
Как создать List<T>, если T заранее не известен? RRS feed

  • Вопрос

  • Хочу реализовать метод, который бы возвращал мне пустой List<T>, в качестве параметра принимал Type T.

    к примеру вариант:

    static object CreateSimpleObject(Type type) {
      object ret = Activator.CreateInstance(type);
      return ret;
    }
    
    

    работает и возвращает объект указанного типа. А мне нужно чтобы возвращался пустой лист.

    Как это можно реализовать? Заранее спасибо!

    +тоже самое нужно и для Dictionary<K,T> (типы K и T тоже должен принимать в параметрах)

    19 октября 2010 г. 4:46

Ответы

  •         static List<T> Method<T>(T val)

            {

                return new List<T>();

            }

     

            static Dictionary<K, T> Method2<K, T>(K val1, T val2)

            {

                return new Dictionary<K, T>();

            }

     

    • Помечено в качестве ответа Абай 19 октября 2010 г. 13:08
    • Снята пометка об ответе Абай 26 октября 2010 г. 5:31
    • Помечено в качестве ответа Абай 26 октября 2010 г. 5:33
    19 октября 2010 г. 5:33
  • Создать List<T> можно и без генерик-метода, но вернуть из него ты сможешь только object, или любой интерйфейс, общий для всех List<T>.
     
    public static object GetListOf(Type t)
    {
        Type genericListType = typeof(List<>);
        Type listType = genericListType.MakeGenericType(t);
        return Activator.CreateInstance(listType);
    }
    • Помечено в качестве ответа Абай 26 октября 2010 г. 5:30
    21 октября 2010 г. 9:41
    Модератор

Все ответы

  •         static List<T> Method<T>(T val)

            {

                return new List<T>();

            }

     

            static Dictionary<K, T> Method2<K, T>(K val1, T val2)

            {

                return new Dictionary<K, T>();

            }

     

    • Помечено в качестве ответа Абай 19 октября 2010 г. 13:08
    • Снята пометка об ответе Абай 26 октября 2010 г. 5:31
    • Помечено в качестве ответа Абай 26 октября 2010 г. 5:33
    19 октября 2010 г. 5:33
  • В таком варианте я должен передавать методу экземпляр класса. (а хотелось, чтобы я мог передать тип)

    Спасибо! Задача решена, решил подкорректировать архитектуру.

    PS: но если кто-нибудь предложит вариант, в котором бы я мог передать только тип, и метод вернул бы мне List<переданный тип> а не List<object>, было бы очень интересно посмотреть. (Этим мне поможете, Спасибо!)

    19 октября 2010 г. 6:53
  • а, не так понял вопрос сначала, ну вот к примеру

            static List<T> Method<T>(Type t)

            {

                T obj = (T)Activator.CreateInstance(t);

                return new List<T>() { obj };

            }

     

     

    19 октября 2010 г. 7:04
  • В таком варианте я все равно не могу сообщить методу тип. (он у меня вычисляется через рефлексию, в ходе выполнения) в угловых скобках при обобщении я не могу указать переменную((
    Вообще такое возможно? или в любом случае я буду получать List<object> вместо List<T> //условие: T - переменная
    19 октября 2010 г. 10:01
  • возникли такие вопросы:
    Как можно привести List<object> к лист List<T>, если предполагается, что все объекты являются объектами типа T?

    Возможно ли написать метод аналогичный приведенному, но возвращать он должен объект уже приведенный к "type"//Переданный в качестве параметра. Любой ответ приветствуется, заранее спасибо!

    static object CreateSimpleObject(Type type) {
     object ret = Activator.CreateInstance(type);
     return ret;
    }
    

    19 октября 2010 г. 10:53
  • Создать List<T> можно и без генерик-метода, но вернуть из него ты сможешь только object, или любой интерйфейс, общий для всех List<T>.
     
    public static object GetListOf(Type t)
    {
        Type genericListType = typeof(List<>);
        Type listType = genericListType.MakeGenericType(t);
        return Activator.CreateInstance(listType);
    }
    • Помечено в качестве ответа Абай 26 октября 2010 г. 5:30
    21 октября 2010 г. 9:41
    Модератор