加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何使用Reflections将DataTable转换为List

发布时间:2020-12-15 04:30:34 所属栏目:百科 来源:网络整理
导读:我有一个类的通用列表,我使用反射和扩展方法自动将其转换为DataTable.现在我想反向执行.我想将DataTable转换为List.Better说我想要帮助写一个方法期望一个DataTable和一个Type,并根据列名自动查找该类型(类)的属性,并为该Type(类)的对象赋值.就像这个psodu代
我有一个类的通用列表,我使用反射和扩展方法自动将其转换为DataTable.现在我想反向执行.我想将DataTable转换为List.Better说我想要帮助写一个方法期望一个DataTable和一个Type,并根据列名自动查找该类型(类)的属性,并为该Type(类)的对象赋值.就像这个psodu代码:
private List<T> ConvertToList<T>(DataTable dt)
{
    List<string> AllColumns = // Get All Column Names of a DataTable
    for(int i=0;i<dt.Rows.Count;i++)
    {
        foreach(var item in AllColumns )
        {
             //Get Property According To **ITEM**
             //Get Data Of Rows[i][item] and assign it to T.property
        }
    }
}

我怎么能这样做?

编辑1)

我用@Cuong Le的回答是这样的:

var properties = typeof(CustomType).GetProperties().ToList();
List<CustomType> list = ConvertToList<CustomType>(dt,properties);

并且:

private List<T> ConvertToList<T>(DataTable dt,List<PropertyInfo> fields) where T : class
{
    return dt.AsEnumerable().Select(Convert<T>(fields)).ToList();  <------
}

private T Convert<T>(DataRow row,List<PropertyInfo> fields) where T : class
{
    var properties = typeof(T).GetProperties().ToList();

    var objT = Activator.CreateInstance<T>();
    foreach (var pro in properties)
    {
        pro.SetValue(objT,row[pro.Name],null);
    }

    return objT;
}

但是在排队中我在它前面放了一个箭头我得到了这两个错误:

No overload for method ‘Convert’ takes 1 arguments

The type arguments for method ‘System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection,System.Func)’ cannot be inferred from the usage. Try specifying the type arguments explicitly.

我怎么能解决这个问题?

解决方法

使用AsEnumerable()方法来支持LINQ:
private List<T> ConvertToList<T>(DataTable dt)
    {
        var columnNames = dt.Columns.Cast<DataColumn>()
            .Select(c => c.ColumnName)
            .ToList();

        var properties = typeof(T).GetProperties();

        return dt.AsEnumerable().Select(row =>
            {
                var objT = Activator.CreateInstance<T>();

                foreach (var pro in properties)
                {
                    if (columnNames.Contains(pro.Name))
                        pro.SetValue(objT,row[pro.Name]);
                }

                return objT;
            }).ToList();

    }

GetProperties searches for the properties of the current Type,using the specified binding constraints.

链接在这里:http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读