none
Обобщенный метод, Как создать экземпляр передоваемого типа. RRS feed

  • Вопрос

  • Доброго времени суток, пытаюсь написать обобщенный метод следующего вида
     void LoadData<T,J>(ObservableCollection<J>Colection) where T:class
            {
                var data = Worker.GetListRow<T>();
                foreach (var r in data) 
                {
                    Colection.Add(new J(r));//Вот здесь ошибка
                } 
            }
    Подскажите пожалуйста как создать экземпляр типа J и вообще возможно ли это.
    2 февраля 2015 г. 6:00

Ответы

  • Добрый день.

    Во-первых, вы не объявили что у вас J обязательно должно иметь конструктор, надо вызов переопределить вот так:

    void LoadData<T, J>(ObservableCollection<J> Colection) where T : class where J : class, new()

    Во-вторых, даже это не позволит вызывать конструкторы с параметром. Подробнее здесь.

    В-третьих, если вам уж очень нужно вызвать конструктор с параметром, то это придется делать через Reflection, например, вот так:

     
    J temp = (J)(typeof(J).GetConstructor(new Type[] { typeof(T) }).Invoke(new object[] { r }));
    Colection.Add(temp);
    Но здесь уже могут начаться проблемы, если тип J не будет содержать конструктора принимающего тип T. На этапе компиляции вам это проверить не удастся.

    2 февраля 2015 г. 6:21
    Отвечающий

Все ответы

  • Добрый день.

    Во-первых, вы не объявили что у вас J обязательно должно иметь конструктор, надо вызов переопределить вот так:

    void LoadData<T, J>(ObservableCollection<J> Colection) where T : class where J : class, new()

    Во-вторых, даже это не позволит вызывать конструкторы с параметром. Подробнее здесь.

    В-третьих, если вам уж очень нужно вызвать конструктор с параметром, то это придется делать через Reflection, например, вот так:

     
    J temp = (J)(typeof(J).GetConstructor(new Type[] { typeof(T) }).Invoke(new object[] { r }));
    Colection.Add(temp);
    Но здесь уже могут начаться проблемы, если тип J не будет содержать конструктора принимающего тип T. На этапе компиляции вам это проверить не удастся.

    2 февраля 2015 г. 6:21
    Отвечающий
  • Большое спасибо помогло
    2 февраля 2015 г. 7:01
  • Пожалуйста.
    Будут вопросы, обращайтесь, постараемся помочь.
    2 февраля 2015 г. 7:09
    Отвечающий