如何将对象转换为通用

时间:2015-09-17 05:31:02

标签: c# type-conversion

如果我在C#中从数据库中获取了一些值,它们就是类型对象。现在我想转换这些值typesafe,将它们加载到我的对象中,该对象或多或少代表datarow。所以我认为为扩展对象创建一个通用的扩展方法会很好。

所以我构建了以下内容:

public static T ConvertToType<T>(this object value)
{
   T returnValue = default(T);
   if (value != DBNull.Value)
   {
      returnValue = (T)value;
   }

   return returnValue;
}

所以我可以使用它来转换给定datarow的不同值,如果数据库存储null值,我会得到默认类型。

例如:

foreach (DataRow row in myTable.Rows)
{
   MyClass myObject = new MyClass();
   myObject.Id = row["ID"].ConvertToType<int>();
}

这适用于编译时,但似乎无法将对象强制转换为int。所以我认为所有的值类型都必须手动处理。

所以我扩展了第一个代码块:

public static T ConvertToType<T>(this object value)
{
   T returnValue = default(T);
   if (value != DBNull.Value)
   {
      if (wert is int)
      {
        rueckgabe = Convert.ToInt32(wert);
      }
      //else if All Value-Types are following...
      else
      {
        returnValue = (T)value;
      }
   }

   return returnValue;
}

但是可以肯定的是编译器现在告诉我目标类型T不能转换为int。这很清楚。

有人在那里为这个问题找到了一个很好的解决方案吗?或者这不是我希望的那么简单。

2 个答案:

答案 0 :(得分:6)

这已经实施。

你可以row.Field<int>("ID")

扩展方法位于System.Data命名空间

对于可空字段,您可以执行row.Field<int?>("ID"),因为.Field为DBNull返回null而不是default(T)

答案 1 :(得分:2)

试试这个: Convert.ChangeType

public static T ConvertTo<T>(this object value)
    {
        T returnValue = default(T);

        if (value is T)
        {
            returnValue = (T)value;
        }
        else
        {
            try
            {
                returnValue = (T)Convert.ChangeType(value, typeof(T));
            }
            catch (InvalidCastException)
            {
                returnValue = default(T);
            }
        }

        return returnValue;
    }

也许您应该考虑不在这里捕获InvalidCastException。如果您可以想象默认的类型值可能在程序中有用,那么让调用方法处理异常可能会更好。