如何将值转换为作为参数传递的类型

时间:2014-12-31 20:17:56

标签: c# database

我有一个将执行聚合函数(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);

1 个答案:

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

请注意,如果rawValuenullT为值类型(struct,例如int),则此(部分)代码将抛出一个例外。这可能比默默地让值为default(T)更好。