将引用原语转换为泛型类型

时间:2012-02-06 18:17:47

标签: c# object methods parameters type-conversion

我知道标题令人困惑所以我会试着更好地解释。这基本上是我想在方法中做的事情:

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对象”。 谢谢你的帮助。

2 个答案:

答案 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
    }
}