Datatable到List,反之亦然

本文关键字:反之亦然 List Datatable | 更新日期: 2023-09-27 18:22:07

我创建了一个扩展方法,将数据表转换为列表,将列表转换为数据表。我对此有很多问题。有人能帮我解决问题吗:

  1. 数据表列和泛型类属性名称都需要相同的偶数和区分大小写。我需要修改它来处理不考虑case的情况,例如:EmployeeName=EmployeeName
  2. 如果泛型类有一个复杂类型作为属性,那么我的函数似乎不起作用。例如:如果我有公共字符串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;
        }
    }

非常感谢您的帮助。干杯

Datatable到List,反之亦然

数据表列和泛型类属性名称都需要相同的偶数和区分大小写。我需要修改它来处理不考虑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中的列。

相关文章: