如何使用Reflections </t>将DataTable转换为List <t>

时间:2012-09-30 15:14:06

标签: c# linq c#-4.0 reflection

我有一个类的通用列表,我使用Reflection和扩展方法自动将其转换为DataTable。现在我想反向执行。我想将DataTable转换为List。更好的说我希望帮助编写一个期望DataTableType的方法,并根据列名自动查找该类型(类)的属性,并为该类型的对象赋值(类)喜欢这个psodu代码:

private List<T> ConvertToList<T>(DataTable dt)
{
    List<string> AllColumns = // Get All Column Names of a DataTable
    for(int i=0;i<dt.Rows.Count;i++)
    {
        foreach(var item in AllColumns )
        {
             //Get Property According To **ITEM**
             //Get Data Of Rows[i][item] and assign it to T.property
        }
    }
}

我怎么能这样做?


修改1)

我像这样使用@Cuong Le的回答:

var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);

和:

private List<T> ConvertToList<T>(DataTable dt,List<PropertyInfo> fields) where T : class
{
    return dt.AsEnumerable().Select(Convert<T>(fields)).ToList();  <------
}

private T Convert<T>(DataRow row,List<PropertyInfo> fields) where T : class
{
    var properties = typeof(T).GetProperties().ToList();

    var objT = Activator.CreateInstance<T>();
    foreach (var pro in properties)
    {
        pro.SetValue(objT, row[pro.Name],null);
    }

    return objT;
} 

但是在排队中我在它前面放了一个箭头我得到了这两个错误:

  

方法'转换'没有重载需要1个参数

  

无法从用法推断出方法'System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection,System.Func)'的类型参数。尝试显式指定类型参数。

我如何解决这个问题?

1 个答案:

答案 0 :(得分:9)

使用AsEnumerable()方法支持LINQ:

    private List<T> ConvertToList<T>(DataTable dt)
    {
        var columnNames = dt.Columns.Cast<DataColumn>()
            .Select(c => c.ColumnName)
            .ToList();

        var properties = typeof(T).GetProperties();

        return dt.AsEnumerable().Select(row =>
            {
                var objT = Activator.CreateInstance<T>();

                foreach (var pro in properties)
                {
                    if (columnNames.Contains(pro.Name))
                        pro.SetValue(objT, row[pro.Name]);
                }

                return objT;
            }).ToList();

    }
  

GetProperties使用指定的绑定约束搜索当前Type的属性。

此处的链接:http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx