C# 要列出的数据表,反之亦然
我创建了一个扩展方法来将datatable转换为list,并将list转换为datatable。我对此有很多问题。有人能帮我解决这些问题吗C# 要列出的数据表,反之亦然,c#,.net,datatable,extension-methods,C#,.net,Datatable,Extension Methods,我创建了一个扩展方法来将datatable转换为list,并将list转换为datatable。我对此有很多问题。有人能帮我解决这些问题吗 datatable列和泛型类属性名称都需要相同且区分大小写。我需要修改它来处理不考虑案例的情况,例如:EmployeeName=EmployeeName 如果泛型类有一个复杂类型作为属性,那么我的函数似乎不起作用。例:如果我有公共字符串EmployeeName{get;set;},我的代码可以工作,但如果我有公共部门详细信息{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;
}
}
公共静态列表ToList(此数据表),其中T:new()
{
尝试
{
var dataList=新列表();
const BindingFlags flags=BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic;
var propertyList=(来自typeof(T).GetProperties(标志)中的PropertyInfo属性)
选择新的
{
Name=property.Name,
Type=Nullable.GetUnderlineType(property.PropertyType)??property.PropertyType
}).ToList();
var dataTableFieldNames=(来自table.Columns中的DataColumn columnHeader
选择新的{Name=columnHeader.ColumnName,Type=columnHeader.DataType});
var commonProperties=propertyList.Intersect(dataTableFieldNames.ToList();
foreach(表中的DataRow DataRow.AsEnumerable().ToList())
{
var templateType=new T();
foreach(commonProperties中的var字段)
{
PropertyInfo propertyInfos=templateType.GetType().GetProperty(field.Name);
PropertyInfo.SetValue(templateType,dataRow[field.Name],null);
}
dataList.Add(templateType);
}
返回数据列表;
}
捕获(例外情况除外)
{
投掷;
}
}
非常感谢您的帮助。干杯
datatable列和泛型类属性名称都需要相同且区分大小写。我需要修改它来处理不考虑案例的情况,例如:EmployeeName=EmployeeName
那部分很简单。您可以不敏感地比较名称的大小写:
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
中的列。第一个解决方案对我来说很好。谢谢你。是的,你是对的,第二个有点棘手。我想这些问题是相关的,但我想这是一个决定,我需要采取如何设计它,而不是有一个共同的解决方案,这样的问题。