gpt4 book ai didi

c# - 如何让泛型处理需要仔细转换的返回值?

转载 作者:太空狗 更新时间:2023-10-29 20:03:53 25 4
gpt4 key购买 nike

我有一些数据访问层代码调用存储过程并返回各种数据类型的标量值。语法是 ExecuteDecimal、ExecuteString 等。我希望它是 Execute<string>Execute<decimal>

我尝试了这个实现,但我无法编译,除非我使用“(T) 值”进行转换,如果我尝试检查类型并调用方法来进行转换,就没有这样的运气。

更新的问题为什么在转换为 T 之前必须先转换为对象?

更新代码

internal T Execute<T>(string storedProcName, Hashtable parameters)
{
//Next lines do compile (thanks to suggestions from answers!)
if (typeof(T) == typeof(string))
return (T) (object) ExecuteScalar(storedProcName, parameters).ToString();
else if (typeof(T) == typeof(int))
return (T)(object) Convert.ToInt32(ExecuteScalar(storedProcName, parameters));
//Next line compiles, but not all things boxed in an object can
//be converted straight to type T (esp db return values that might contain DbNull.Value, etc)
return (T)ExecuteScalar(storedProcName, parameters);
}

最佳答案

试试这个:

var result = ExecuteScalar(storedProcName, parameters);
if(Convert.IsDBNull(result))
return default(T);
if(result is T) // just unbox
return (T)result;
else // convert
return (T)Convert.ChangeType(result, typeof(T));

已更新:修复了 DBNull 处理

关于c# - 如何让泛型处理需要仔细转换的返回值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2976373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com