【问题标题】:Using GetField<T> to set values in an object from a DataRow使用 GetField<T> 从 DataRow 设置对象中的值
【发布时间】:2017-02-28 18:04:02
【问题描述】:

我正在尝试编写一个通用方法来从 DataRow 中的列返回值。

    protected static T GetField<T>(DataRow row, string name, T defaultValue)
    {
        if (row == null)
        {
            throw new ArgumentNullException("row");
        }

        T result = defaultValue;
        if (row.Table.Columns.Contains(name) && !row.IsNull(name))
        {                
            result = row.Field<T>(name);
        }
        return result;
    }

当尝试为特定测试分配值时,我得到“指定的强制转换无效。”例外。

var rule = new MyObj
{                   
    AString = GetField(row, "AnswerId", "test"),
    AnInt  = GetField(row, "Decline", 0),
    ADecimal = GetField(row, "LoadFactor", 1M),                                     
};

我试图避免为每种类型编写重载。

这个可以吗?

【问题讨论】:

  • 数据库中的“LoadFactor”是十进制的吗?
  • 如果拒绝在数据库中位,您需要将布尔值作为第三个参数传递给 getField 方法。
  • 您可以使用对象而不是泛型,并在对象创建时适当地进行强制转换。你考虑过这个吗?
  • @Jenish。是的,但 int 也给出了错误
  • @sphaso,是的。我只是想知道是否可以这样做。

标签: c# generics ado.net datarow


【解决方案1】:

您可以使用这些扩展方法将整个DataTable 转换为List,而不是为DataRow 编写方法:

public static class DataTableExtensions
    {
        public static List<T> ToList<T>(this DataTable table) where T : new()
        {
            List<PropertyInfo> properties = typeof(T).GetProperties().ToList();
            List<T> result = new List<T>();

            foreach (var row in table.Rows)
            {
                var item = CreateItemFromRow<T>((DataRow)row, properties);
                result.Add(item);
            }

            return result;
        }

        private static T CreateItemFromRow<T>(DataRow row, List<PropertyInfo> properties) where T : new()
        {
            T item = new T();
            foreach (var property in properties)
            {
                if (row.Table.Columns.Contains(property.Name))
                {
                    if (row[property.Name] != DBNull.Value)
                        property.SetValue(item, row[property.Name], null);
                }
            }
            return item;
        }
    }

并像这样使用它:

List<SomeType> list = SomeDataTable.ToList<SomeType>();

但您必须确保在查询中选择的列的名称应与类属性匹配,并且 datatypes 也应匹配。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2011-05-26
    相关资源
    最近更新 更多