c# titel Wie man DataTable mit Reflexionen zu List<T> konvertiert



title description (1)

Verwenden Sie die AsEnumerable() -Methode, um LINQ zu unterstützen:

    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 sucht mithilfe der angegebenen Bindungseinschränkungen nach den Eigenschaften des aktuellen Typs.

Der Link hier: http://msdn.microsoft.com/en-us/library/kyaxdd3x.aspx

Ich habe eine generische Liste einer Klasse, die ich es mit Reflection und Extension-Methoden automatisch in DataTable konvertieren. Jetzt möchte ich es in umgekehrter Richtung tun. Ich möchte DataTable in List.Better konvertieren, um zu sagen, ich möchte Hilfe, um eine Methode zu schreiben erwartet eine DataTable und einen Type und findet automatisch die Eigenschaft dieses Typs (Klasse) gemäß dem Spaltennamen und weist dem Objekt dieses Typs (Klasse) einen Wert zu. ähnlich wie dieser Psodu-Code:

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
        }
    }
}

Wie kann ich das machen?

Bearbeiten 1)

Ich benutze die Antwort von @Cuong Le so:

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

und :

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;
} 

aber in der Reihe stelle ich einen Pfeil davor. Ich habe diese zwei Fehler:

Keine Überladung für die Methode 'Convert' benötigt 1 Argumente

und

Die Typargumente für die Methode 'System.Data.EnumerableRowCollectionExtensions.Select (System.Data.EnumerableRowCollection, System.Func)' können nicht aus der Verwendung abgeleitet werden. Versuchen Sie, die Typargumente explizit anzugeben.

Wie kann ich dieses Problem lösen?





reflection