Ari*_*ian 6 c# linq reflection c#-4.0
我有一个类的通用列表,我自动将它转换为DataTable使用Reflection和扩展方法.现在我想反向做.我想转换DataTable为List.Better说我想要帮助写一个期望一个方法DataTable和a Type并根据列名自动查找该类型(类)的属性,并为该Type(类)的对象赋值.类似于这个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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么能这样做?
编辑1)
我用@Cuong Le的回答是这样的:
var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt, properties);
Run Code Online (Sandbox Code Playgroud)
并且:
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;
}
Run Code Online (Sandbox Code Playgroud)
但是在排队中我在它前面放了一个箭头我得到了这两个错误:
方法'Convert'没有重载需要1个参数
和
无法从用法推断出方法'System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection,System.Func)'的类型参数.尝试显式指定类型参数.
我怎么能解决这个问题?
使用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();
}
Run Code Online (Sandbox Code Playgroud)
GetProperties使用指定的绑定约束搜索当前Type的属性.
链接在这里:http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx