当前位置:  开发笔记 > 编程语言 > 正文

将DataTable转换为通用List?

如何解决《将DataTable转换为通用List?》经验,为你挑选了1个好方法。



1> Marc Gravell..:

这不会是一个实际的泄漏,但它可能会不必要地强调事情......

你工作了多少行?请注意,反射是一种痛苦,每次调用GetCustomAttributes都会返回一个新数组(所以你想要这样做一次,而不是每行每个属性一次).

就个人而言,我预先构建了我打算做的工作......如下所示.

请注意,如果我这样做,我要么切换到HyperDescriptor,要么.NET 3.5是一个选项,可能是一个已编译的表达式.由于DataTable不是强类型,HyperDescriptor在下面之后将是合乎逻辑的下一步(针对性能)...

sealed class Tuple
{
    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 Convert(DataTable table)
    where T : class, new()
{
    List> map =
        new List>();

    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(
                table.Columns[col.FieldName], pi));
        }
    }

    List list = new List(table.Rows.Count);
    foreach(DataRow row in table.Rows)
    {
        if(row == null)
        {
            list.Add(null);
            continue;
        }
        T item = new T();
        foreach(Tuple 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;        
}

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有