我有一个将执行聚合函数(ie. COUNT(),MIN(), MAX())
有时我想返回int, double, date, datetime....
我在尝试转换返回值时遇到问题
以下行给出了错误value = Convert.ChangeType(vv, typeof(T) );
这是错误
无法将类型'object'隐式转换为'T'。存在显式转换(您是否错过了演员?)
这是我的方法
public T getValue<T>(string query, List<MySqlParameter> pars)
{
T value;
using (var conn = new MySqlConnection(conn_string))
using (var cmd = new MySqlCommand(query, conn))
{
if (pars != null)
{
foreach (MySqlParameter p in pars)
{
cmd.Parameters.Add(p);
}
}
conn.Open();
try
{
object vv = (T)cmd.ExecuteScalar();
if (vv != null)
{
value = Convert.ChangeType(vv, typeof(T) );
}
} catch(Exception ex){
Common.Alert(ex.ToString(), "SQL Error");
value = default(T);
} finally {
conn.Close();
}
}
return value;
}
当我使用这种方法时,我使用这个
int cnt = db.getValue<int>(query, params);
答案 0 :(得分:3)
你的代码没有多大意义。首先你转向T
,然后如果它不为空,你将其转换为T
?转换是没用的。我认为值得指出的是,你得到的特定错误(“不能隐式地将类型'对象'转换为'T'。”)是因为Convert.ChangeType
返回object
,所以它经常被立即转换打电话后:
value = (T)Convert.ChangeType(v, typeof(T));
在您的情况下,您可能希望这样做:
object rawValue = cmd.ExecuteScalar();
value = (T)Convert.ChangeType(rawValue, typeof(T));
请注意,如果rawValue
为null
且T
为值类型(struct
,例如int
),则此(部分)代码将抛出一个例外。这可能比默默地让值为default(T)
更好。