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

C# 将引用原语转换为泛型类型,c#,object,methods,parameters,type-conversion,C#,Object,Methods,Parameters,Type Conversion,我知道这个标题令人困惑,所以我会尽量解释得更好。下面是我想在方法内部执行的基本操作: if (record["id"] != DBNull.Value) _id = Convert.ToInt32(record["id"]); else id = -1; 我希望它适用于存储在数据库中的多种类型。(因此,如果它是一个字符串,它会将其转换为字符串,依此类推)。任何方法都可以,我试着用一种方法。我已经完成了这一步,但C#不会自动将int转换为object。想法 private void Lo

我知道这个标题令人困惑,所以我会尽量解释得更好。下面是我想在方法内部执行的基本操作:

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

您可以使用并使您的方法通用:

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));
}
您可以使用并使您的方法通用:

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));
}

首先,
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
    }
}
private void Load(参考TVar var、TSet obj、TVar def)
{
//这是一个有点笨手笨脚,但在几乎任何情况下
//这可能会失败,您只需要基本类型。
尝试
{
if(var是IConvertible&&obj是IConvertible)
var=(TVar)Convert.ChangeType(obj,typeof(TVar));
其他的
var=(TVar)obj;//可能只有一个显式运算符
}
捕获(例外)
{
var=def;//定义为相同的类型,因此它们总是可赋值的
}
}

首先,
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
    }
}
private void Load(参考TVar var、TSet obj、TVar def)
{
//这是一个有点笨手笨脚,但在几乎任何情况下
//这可能会失败,您只需要基本类型。
尝试
{
if(var是IConvertible&&obj是IConvertible)
var=(TVar)Convert.ChangeType(obj,typeof(TVar));
其他的
var=(TVar)obj;//可能只有一个显式运算符
}
捕获(例外)
{
var=def;//定义为相同的类型,因此它们总是可赋值的
}
}

这仍然会给我同样的错误,因为参数类型不匹配。而且,def只是一个默认值。好吧,那么如果foo==DBNull.value怎么办?对不起,我不知道ChangeType是否涵盖了这一点,或者它是如何工作的。谢谢你的帮助!这仍然给了我同样的错误,因为参数类型不匹配。而且,def只是一个默认值。那么如果foo==DBNull.value会发生什么呢?对不起,我不知道ChangeType是否涵盖了这一点,或者它是如何工作的。谢谢你的帮助!