5

拡張メソッドを使用して DataTable に自動的に変換するクラスのジェネリック リストがあります。今度Reflectionは逆方向に変換したいDataTableと思います。List に変換したいと思います。DataTableそして、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;
} 

しかし、行の前に矢印を配置すると、次の2つのエラーが発生しました。

メソッド 'Convert' のオーバーロードは 1 つの引数を取らない

メソッド 'System.Data.EnumerableRowCollectionExtensions.Select(System.Data.EnumerableRowCollection, System.Func)' の型引数は、使用法から推測できません。型引数を明示的に指定してみてください。

どうすればこの問題を解決できますか?

4

1 に答える 1

8

メソッドを使用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指定されたバインディング制約を使用して、現在の Type のプロパティを検索します。

ここのリンク: http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

于 2012-09-30T15:23:44.190 に答える