C#泛型问题

时间:2010-09-30 09:23:21

标签: c# generics

我有一个方法(见下文)

    public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters)
    {
        if (!string.IsNullOrEmpty(sSql))
        {
            DataAccess dal = new DataAccess(ConnectionString);
            DebugOutput_SQL(sSql, parameters);
            object value = null;
            value = dal.ExecuteScalar(sSql, parameters);

            if (value != null && value != DBNull.Value)
                return (T)value;
        }
        return default(T);
    }

我称之为

 int32 WorkFlowID = DataProvider.ExecuteScalar<Int32>(sSql);

然后它在“return(T)value”行中给出了一个错误“不要取消对值的修改”,对此有任何建议。

3 个答案:

答案 0 :(得分:4)

“不要取消装箱值”听起来像一个奇怪的错误信息。这正是它所说的吗?

我的猜测ExecuteScalar返回的是其他类型(longdouble等),而不是int。在转换为value.GetType()之前尝试记录T

正如旁注,这:

object value = null;
value = dal.ExecuteScalar(sSql, parameters);

将更简单(IMO):

object value = dal.ExecuteScalar(sSql, parameters);

这里没有必要把它放在两个声明中。

编辑:只是为了澄清,它失败的原因是当您取消装箱值时,您必须取消装箱到实际类型,而不仅仅是具有可用转换的类型。例如,如果您想最终获得int,则可以执行以下操作:

int x = (int) (decimal) value;

将取消装箱到decimal,然后将decimal转换为int。但在这种情况下,如果可能的话,我只需要指定正确的类型:)

答案 1 :(得分:4)

你可以尝试:

public T ExecuteScalar<T>(string sSql, params SqlParameter[] parameters)
{
    if (!string.IsNullOrEmpty(sSql))
    {
        DataAccess dal = new DataAccess(ConnectionString);
        DebugOutput_SQL(sSql, parameters);
        object value = null;
        value = dal.ExecuteScalar(sSql, parameters);

        if (value != null && value != DBNull.Value)
            return (T) Convert.ChangeType(value, typeof(T));
    }
    return default(T);
}

答案 2 :(得分:0)

也许你收到的价值对象是Nullable,在这种情况下你可以做

return ((Nullable<T>)value).Value;