我有一个泛型类的列表,我使用Reflection
和扩展方法自动将其转换为DataTable
。现在我想要反向进行操作。我想要将DataTable
转换为列表。更好的说法是,我想要编写一个方法来接受DataTable
和Type
,并根据列名自动查找该类型(类)的属性,并将值分配给该类型(类)的对象。像这个伪代码:
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;
}
但是,在我在代码中加上箭头时,出现了两个错误:
没有重载方法'Convert'接受1个参数
和
无法从用法推断出方法'System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection, System.Func)'的类型参数。请明确指定类型参数。
我该如何解决这个问题?
Select(row => Convert<T>(row, fields))
。 - cuongle