【问题标题】:How to convert object to generic如何将对象转换为泛型
【发布时间】:2015-09-17 05:31:02
【问题描述】:

如果我在 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。这很清楚。

是否有人为这个问题找到了很好的解决方案?还是这不像我希望的那么简单。

【问题讨论】:

    标签: c# type-conversion


    【解决方案1】:

    这已经实现了。

    你可以row.Field&lt;int&gt;("ID")

    扩展方法在System.Data命名空间下

    对于可为空的字段,您可以使用 row.Field&lt;int?&gt;("ID"),因为 .Field 为 DBNull 返回 null 而不是 default(T)

    【讨论】:

    • 在 .Net 4.0 中找不到。
    • @Sebi 你是否包含了命名空间?基于 MSDN,这早在 .Net 3.5 中就存在
    • 找到了 ;) 我必须包含 dll System.Data.DataSetExtension。认为 System.Data 就足够了。谢谢,太好了:)
    • 我猜这个方法没有按预期工作。如果我在 dataRow 中得到值“1”,则不能将其转换为 int。我认为这应该是可能的。
    • 仅当 db 字段也表示整数时。
    【解决方案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。如果您可以想象默认类型值在您的程序中可能会有一些用处,那么让调用方法处理异常可能会更好。

    【讨论】:

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