将引用基元转换为泛型类型
本文关键字:泛型类型 转换 引用 | 更新日期: 2023-09-27 18:22:37
我知道标题很混乱,所以我会尽量解释得更好。以下是我想在一个方法中做的基本内容:
if (record["id"] != DBNull.Value) _id = Convert.ToInt32(record["id"]);
else id = -1;
我希望它适用于我存储在数据库中的多种类型。(因此,如果它是一个字符串,它会将其转换为字符串,依此类推)。任何方法都可以做到这一点,而我正试图用一种方法来做到。我已经做到了这一点,但C#不会自动将int转换为object。想法?
private void Load(ref object var, object obj, object def)
{
if (var is int)
{
var = Convert.ToInt32(obj);
}
}
int _id;
Load(ref _id, record["id"], -1);
为了澄清,我的错误是"无法从ref int转换为ref object"。谢谢你的帮助。
您可以使用Convert.ChangeType()
并使您的方法通用:
private void Load<T, U>(out T value, U obj, T defaultValue)
{
if (obj is DBNull)
value = defaultValue;
else
value = (T)Convert.ChangeType(obj, typeof(T));
}
现在您可以这样使用它(简化示例,不确定您需要def
做什么):
int id;
object foo = 42;
Load(out id, foo, 1);
首先,var
是C#3.0及以上版本(VS 2008及更高版本)中的保留字。
更重要的是,我会尝试将其设置为通用;这样,您的方法可以发现您传入的变量的真实类型,并像处理强类型变量一样逐个处理它们:
private void Load<TVar, TSet>(ref TVar var, TSet obj, TVar def)
{
//this is a little heavy-handed, but in pretty much any situation where
//this can fail, you just want the basic type.
try
{
if (var is IConvertible && obj is IConvertible)
var = (TVar)Convert.ChangeType(obj, typeof(TVar));
else
var = (TVar)obj; //there may just be an explicit operator
}
catch(Exception)
{
var = def; //defined as the same type so they are always assignable
}
}