【问题标题】:Convert reference primitives to generic type将引用原语转换为泛型类型
【发布时间】:2012-02-28 05:18:15
【问题描述】:

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

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

【问题讨论】:

    标签: c# object methods parameters type-conversion


    【解决方案1】:

    您可以使用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);
    

    【讨论】:

    • 这仍然给我同样的错误,因为参数类型不匹配。
    • 另外,def 只是一个默认值。
    • 好的,如果 foo == DBNull.Value 会发生什么?
    • 抱歉,我不知道 ChangeType 是否涵盖了这一点或它是如何工作的。感谢您的帮助!
    【解决方案2】:

    首先,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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多