Datatable到List,反之亦然
本文关键字:反之亦然 List Datatable | 更新日期: 2023-09-27 18:22:07
我创建了一个扩展方法,将数据表转换为列表,将列表转换为数据表。我对此有很多问题。有人能帮我解决问题吗:
- 数据表列和泛型类属性名称都需要相同的偶数和区分大小写。我需要修改它来处理不考虑case的情况,例如:EmployeeName=EmployeeName
- 如果泛型类有一个复杂类型作为属性,那么我的函数似乎不起作用。例如:如果我有公共字符串EmployeeName{get;set;},我的代码就可以工作,但如果我有Public Department DepartmentDetails{get;set;}(知道这个有点棘手,但如果有人能给我一个如何处理的建议,我会很高兴。)
请在下面找到我的扩展方法。
public static List<T> ToList<T>(this DataTable table) where T : new()
{
try
{
var dataList = new List<T>();
const BindingFlags flags = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
var propertyList = (from PropertyInfo property in typeof(T).GetProperties(flags)
select new
{
Name = property.Name,
Type = Nullable.GetUnderlyingType(property.PropertyType) ?? property.PropertyType
}).ToList();
var dataTableFieldNames = (from DataColumn columnHeader in table.Columns
select new { Name = columnHeader.ColumnName, Type = columnHeader.DataType }).ToList();
var commonProperties = propertyList.Intersect(dataTableFieldNames).ToList();
foreach (DataRow dataRow in table.AsEnumerable().ToList())
{
var templateType = new T();
foreach (var field in commonProperties)
{
PropertyInfo propertyInfos = templateType.GetType().GetProperty(field.Name);
propertyInfos.SetValue(templateType, dataRow[field.Name], null);
}
dataList.Add(templateType);
}
return dataList;
}
catch (Exception ex)
{
throw;
}
}
非常感谢您的帮助。干杯
数据表列和泛型类属性名称都需要相同的偶数和区分大小写。我需要修改它来处理不考虑case的情况,例如:EmployeeName=EmployeeName。
那部分很简单。您可以无意识地比较Name的大小写:
var commonProperties = propertyList
.Where(p => dataTableFieldNames
.Any(d => string.Equals(d.Name, p.Name, StringComparison.OrdinalIgnoreCase) &&
d.Type == p.Type).ToList();
如果泛型类有一个复杂类型作为属性,那么我的函数似乎不起作用。
现在这有点难,取决于在这种情况下你想做什么?您的DataTable
是否也包含属于其他类型的列(例如Departmant
)?如果是这样,您将需要确定您拥有哪些类型的属性(此外,除了内置类型之外),以及DataTable
中存在哪些针对这些类型的附加列。然后,您可以获得每种类型的属性,并将它们映射到DataTable
中的列。