将引用基元转换为泛型类型

本文关键字:泛型类型 转换 引用 | 更新日期: 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
    }
}