Convert DataTable to generic List?

前端 未结 1 852
清酒与你
清酒与你 2020-11-27 07:00
    public static IList ConvertTo(DataTable table)
    {
        if (table == null)
        {
            return null;
        }

        List

        
相关标签:
1条回答
  • 2020-11-27 07:55

    That won't be an actual leak, but it could be stressing things unnecessarily...

    How many rows are you working over? Note that reflection is a pain, and that every call to things like GetCustomAttributes can return a new array (so you want to do that once, not once per-property-per-row).

    Personally, I'd pre-construct the work I intend to do... something like below.

    Note that if I was doing this lots, I'd either switch to HyperDescriptor, or if .NET 3.5 was an option, maybe a compiled Expression. Since DataTable isn't strongly typed, HyperDescriptor would be a logical next step (for performance) after the below...

    sealed class Tuple<T1, T2>
    {
        public Tuple() {}
        public Tuple(T1 value1, T2 value2) {Value1 = value1; Value2 = value2;}
        public T1 Value1 {get;set;}
        public T2 Value2 {get;set;}
    }
    public static List<T> Convert<T>(DataTable table)
        where T : class, new()
    {
        List<Tuple<DataColumn, PropertyInfo>> map =
            new List<Tuple<DataColumn,PropertyInfo>>();
    
        foreach(PropertyInfo pi in typeof(T).GetProperties())
        {
            ColumnAttribute col = (ColumnAttribute)
                Attribute.GetCustomAttribute(pi, typeof(ColumnAttribute));
            if(col == null) continue;
            if(table.Columns.Contains(col.FieldName))
            {
                map.Add(new Tuple<DataColumn,PropertyInfo>(
                    table.Columns[col.FieldName], pi));
            }
        }
    
        List<T> list = new List<T>(table.Rows.Count);
        foreach(DataRow row in table.Rows)
        {
            if(row == null)
            {
                list.Add(null);
                continue;
            }
            T item = new T();
            foreach(Tuple<DataColumn,PropertyInfo> pair in map) {
                object value = row[pair.Value1];
                if(value is DBNull) value = null;
                pair.Value2.SetValue(item, value, null);
            }
            list.Add(item);
        }
        return list;        
    }
    
    0 讨论(0)
提交回复
热议问题