我创建了一个扩展方法,将数据表转换为list并列表为datatable。我有很多问题。有人可以帮我解决问题:
请在下面找到我的扩展方法。
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;
}
}
非常感谢任何帮助。干杯!!!
答案 0 :(得分:2)
两个数据表列和泛型类属性名称必须相同,并且区分大小写。我需要修改它来处理不考虑案例的情况ex: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
。