数据表到列表,反之亦然

时间:2014-09-17 11:35:06

标签: c# .net datatable extension-methods

我创建了一个扩展方法,将数据表转换为list并列表为datatable。我有很多问题。有人可以帮我解决问题:

  1. 两个数据表列和泛型类属性名称必须相同,并且区分大小写。我需要修改它来处理不考虑案例的情况ex:EmployeeName = employeename。
  2. 如果泛型类具有复杂类型作为属性,那么我的函数似乎不起作用。例如:如果我有公共字符串EmployeeName {get;设置;}我的代码有效,但如果我有公共部门DepartmentDetails {get;设置;}(知道这个有点棘手,但如果有人能给我一个如何处理这个问题的建议,我会很高兴的。)
  3. 请在下面找到我的扩展方法。

    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;
            }
        }
    

    非常感谢任何帮助。干杯!!!

1 个答案:

答案 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

中的列