【问题标题】:Datatable to List and vice versa数据表到列表,反之亦然
【发布时间】:2014-09-17 11:35:05
【问题描述】:

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

  1. 数据表列和通用类属性名称需要相同且区分大小写。我需要修改它以处理不考虑大小写的情况,例如: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;
        }
    }

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

【问题讨论】:

    标签: c# .net datatable extension-methods


    【解决方案1】:

    数据表列和通用类属性名称需要相同且区分大小写。我需要对此进行修改以处理不考虑大小写的情况,例如: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 中的列。

    【讨论】:

    • 第一个解决方案对我来说很好。感谢那。是的,你是对的,第二个有点棘手。我想这些问题是相关的,但我想这是我需要做出如何设计而不是为此类问题提供通用解决方案的决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2013-03-04
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多