Я пытаюсь вызвать общую функцию из другого потока, но по какой-то причине мой общий параметр 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» в универсальном типе или методе.
только когда я звоню из задачи.
Как же так? тип T не всегда является строкой, мне нужно, чтобы во время выполнения это были разные вещи
Разве T не предоставляется исполняемым методом в его угловых скобках <T>, так что я бы назвал его как execQuery<SomeType>()?
@ Shady3cho Возникла некоторая путаница, потому что <T> не был виден до вашего редактирования.





В extractSingleItem у вас есть общая константа where T : new(). Вы не определили такое же ограничение в execQuery, поэтому нет гарантии, что T ему удовлетворяет. Просто добавьте такое же общее ограничение в execQuery, и все заработает:
public override void execQuery<T>(string query, Dictionary<string, dynamic> qparams, EventHandler<dynamic> callBack)
where T : new()
Вау, спасибо, я не знаю, как я это пропустил, мне нужно добавить «where T: new ()» в переопределенную функцию
var res = extractSingleItem<T>(dr);это не так. Это должно быть что-то вроде varres = extractSingleItem<string>(dr);.