Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 要列出的数据表,反之亦然_C#_.net_Datatable_Extension Methods - Fatal编程技术网

C# 要列出的数据表,反之亦然

C# 要列出的数据表,反之亦然,c#,.net,datatable,extension-methods,C#,.net,Datatable,Extension Methods,我创建了一个扩展方法来将datatable转换为list,并将list转换为datatable。我对此有很多问题。有人能帮我解决这些问题吗 datatable列和泛型类属性名称都需要相同且区分大小写。我需要修改它来处理不考虑案例的情况,例如:EmployeeName=EmployeeName 如果泛型类有一个复杂类型作为属性,那么我的函数似乎不起作用。例:如果我有公共字符串EmployeeName{get;set;},我的代码可以工作,但如果我有公共部门详细信息{get;set;}(知道这有点棘

我创建了一个扩展方法来将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

    中的列。第一个解决方案对我来说很好。谢谢你。是的,你是对的,第二个有点棘手。我想这些问题是相关的,但我想这是一个决定,我需要采取如何设计它,而不是有一个共同的解决方案,这样的问题。