Вызов универсальной функции из задачи? - PullRequest
0 голосов
/ 21 января 2019

Я пытаюсь вызвать универсальную функцию из другого потока, но по какой-то причине мой универсальный параметр T, похоже, не распознается изнутри задачи. Моя общая функция выглядит так

   private T extractSingleItem<T>(NpgsqlDataReader dr) where T : new()
    {
        T c = new T();
        if (dr.Read())
        {

            foreach (PropertyInfo p in typeof(T).GetProperties(BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Instance))
            {
                try
                {
                    //extracting the column name for the property's attributes
                    string column = ((TableAttribute)p.GetCustomAttribute(typeof(TableAttribute))).Column;
                    c.GetType().GetProperty(p.Name).SetValue(c, dr[column]);
                }
                catch
                {

                }
            }
        }

        return c;
    }

и я пытаюсь назвать это так

public override void execQuery<T>(string query, Dictionary<string, dynamic> qparams, EventHandler<dynamic> callBack) 
    {


        Task.Run(() => {

            string db = mConnection.Database;
            if (mConnection.State == ConnectionState.Closed)
                mConnection.Open();


            NpgsqlCommand command = new NpgsqlCommand(query, mConnection);

            command.Parameters.AddRange(qparams.Select(x => new NpgsqlParameter(x.Key, x.Value)).ToArray());

            NpgsqlDataReader dr = null;

            try
            {
                dr = command.ExecuteReader();
            }
            catch
            {
                command.Connection = genNewConn();
                dr = command.ExecuteReader();

            }

            var res = extractSingleItem<T>(dr);

        });


    }

но у кого то я получаю эту ошибку

"Код серьезности Описание Состояние подавления строки файла проекта Ошибка CS0310 «T» должна быть неабстрактного типа с открытым конструктором без параметров, чтобы использовать его в качестве параметра «T» в универсальном типе или методе «

только когда я звоню изнутри задачи.

1 Ответ

0 голосов
/ 21 января 2019

В extractSingleItem у вас есть общее содержание where T : new(). Вы не определили такое же ограничение в execQuery, поэтому нет гарантии, что T его удовлетворит. Просто добавьте то же общее ограничение к execQuery, и оно будет работать:

public override void execQuery<T>(string query, Dictionary<string, dynamic> qparams, EventHandler<dynamic> callBack) 
    where T : new()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...