我正在尝试从其他线程调用通用函数,但是由于某种原因,似乎无法从任务中识别出通用参数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'”
仅当我从任务内致电时。
答案 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()