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

C# 从任务内部调用泛型函数?,c#,generics,task,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).GetPrope

我试图从另一个线程调用泛型函数,但由于某种原因,我的泛型参数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);

        });


    }
private T extractSingleItem(NpgsqlDataReader dr),其中T:new()
{
tc=新的T();
if(dr.Read())
{
foreach(typeof(T).GetProperties(BindingFlags.flattHierarchy | BindingFlags.Public | BindingFlags.Instance)中的PropertyInfo p)
{
尝试
{
//提取属性属性的列名
字符串列=((TableAttribute)p.GetCustomAttribute(typeof(TableAttribute))).column;
c、 GetType().GetProperty(p.Name).SetValue(c,dr[column]);
}
抓住
{
}
}
}
返回c;
}
我试着这样称呼它

   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);

        });


    }
public override void execQuery(字符串查询、字典qparams、EventHandler回调)
{
Task.Run(()=>{
字符串db=mConnection.Database;
if(mConnection.State==ConnectionState.Closed)
mConnection.Open();
NpgsqlCommand=newnpgsqlcommand(查询,mConnection);
command.Parameters.AddRange(qparams.Select(x=>newnpgsqlparameter(x.Key,x.Value)).ToArray();
NpgsqlDataReader dr=null;
尝试
{
dr=command.ExecuteReader();
}
抓住
{
command.Connection=genNewConn();
dr=command.ExecuteReader();
}
var res=单个项目(dr);
});
}
但是有人告诉我这个错误

“严重性代码说明项目文件行抑制状态 错误CS0310“T”必须是具有公共无参数构造函数的非抽象类型,才能将其用作泛型类型或方法中的参数“T”


仅当我从任务内部调用时。

提取单个项中
您具有通用常量
其中T:new()
。您没有在
execQuery
中定义相同的约束,因此不能保证T满足它。只需将相同的通用约束添加到
execQuery
即可:

public override void execQuery<T>(string query, Dictionary<string, dynamic> qparams, EventHandler<dynamic> callBack) 
    where T : new()
public override void execQuery(字符串查询、字典qparams、EventHandler回调)
其中T:new()

extractSingleItem
中,您拥有通用constant
其中T:new()
。您没有在
execQuery
中定义相同的约束,因此不能保证T满足它。只需将相同的通用约束添加到
execQuery
即可:

public override void execQuery<T>(string query, Dictionary<string, dynamic> qparams, EventHandler<dynamic> callBack) 
    where T : new()
public override void execQuery(字符串查询、字典qparams、EventHandler回调)
其中T:new()

var res=extractSingleItem(dr)那是不对的。它应该类似于var
res=extractSingleItem(dr)如何?类型T并不总是一个字符串,我需要它在运行时是不同的东西是不是执行方法在尖括号中没有提供T,这样我就可以像execQuery()一样调用它?@Shady3cho有一些混淆,因为在编辑
var res=extractSingleItem(dr)之前,
不可见那是不对的。它应该类似于var
res=extractSingleItem(dr)如何?类型T并不总是一个字符串,我需要它在运行时是不同的东西是不是T不是由执行方法在尖括号中提供的,因此我会像execQuery()一样调用它?@Shady3cho有一些混淆,因为在编辑之前,
不可见哇谢谢,我不知道我怎么会错过它,我需要在overidden函数上添加“where T:new()”哇,谢谢,我不知道我怎么会错过这个,我需要在overidden函数上添加“where T:new()”