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

本文关键字:参数传递 类型 转换 | 更新日期: 2023-09-27 18:35:51

我有一个函数可以执行聚合函数(ie. COUNT(),MIN(), MAX())

有时我想回来int, double, date, datetime....

我在尝试转换返回值时遇到问题

以下行给了我一个错误value = Convert.ChangeType(vv, typeof(T) );

这是错误

不能将类型"对象"隐式转换为"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);

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

你的代码没有多大意义。首先你投射到 T ,然后如果它不为 null,你把它转换为 T ?转换是没有用的。我认为值得指出的是,您遇到的特定错误("无法隐式将类型'对象'转换为'T'")是因为Convert.ChangeType返回一个object,因此通常在调用后立即强制转换:

value = (T)Convert.ChangeType(v, typeof(T));

在您的情况下,您可能需要执行以下操作:

object rawValue = cmd.ExecuteScalar();
value = (T)Convert.ChangeType(rawValue, typeof(T));

请注意,如果rawValuenull并且T是值类型(struct,例如 int ),此(部分)代码将引发异常。这可能比默默地让值default(T)要好。