如何使用Reflections将DataTable转换为List

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

 private List ConvertToList(DataTable dt) { List 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 list = ConvertToList(dt, properties); 

并且:

 private List ConvertToList(DataTable dt,List fields) where T : class { return dt.AsEnumerable().Select(Convert(fields)).ToList(); <------ } private T Convert(DataRow row,List fields) where T : class { var properties = typeof(T).GetProperties().ToList(); var objT = Activator.CreateInstance(); foreach (var pro in properties) { pro.SetValue(objT, row[pro.Name],null); } return objT; } 

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

方法’Convert’没有重载需要1个参数

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

我怎么能解决这个问题?

使用AsEnumerable()方法来支持LINQ:

  private List ConvertToList(DataTable dt) { var columnNames = dt.Columns.Cast() .Select(c => c.ColumnName) .ToList(); var properties = typeof(T).GetProperties(); return dt.AsEnumerable().Select(row => { var objT = Activator.CreateInstance(); 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