从任务内部调用泛型函数?

时间:2019-01-21 14:03:01

标签: c# generics task

我正在尝试从其他线程调用通用函数,但是由于某种原因,似乎无法从任务中识别出通用参数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 :(得分:2)

extractSingleItem中,您具有通用约束where T : new()。您尚未在execQuery中定义相同的约束,因此不能保证T满足它。只需向execQuery添加相同的通用约束,它就会起作用:

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