我知道标题令人困惑所以我会试着更好地解释。这基本上是我想在方法中做的事情:
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对象”。 谢谢你的帮助。
答案 0 :(得分:3)
您可以使用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);
答案 1 :(得分: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
}
}