Hier Erweiterung Methode Datatable konvertieren zur Objektliste:
public static class Extensions
{
public static List<T> ToList<T>(this DataTable table) where T : new()
{
IList<PropertyInfo> properties = typeof(T).GetProperties().ToList();
List<T> result = new List<T>();
foreach (var row in table.Rows)
{
var item = CreateItemFromRow<T>((DataRow)row, properties);
result.Add(item);
}
return result;
}
private static T CreateItemFromRow<T>(DataRow row, IList<PropertyInfo> properties) where T : new()
{
T item = new T();
foreach (var property in properties)
{
if (property.PropertyType == typeof(System.DayOfWeek))
{
DayOfWeek day = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), row[property.Name].ToString());
property.SetValue(item,day,null);
}
else
{
if(row[property.Name] == DBNull.Value)
property.SetValue(item, null, null);
else
property.SetValue(item, row[property.Name], null);
}
}
return item;
}
}
Nutzung:
List<Employee> lst = ds.Tables[0].ToList<Employee>();
@ itay.b CODE ERKLÄRT: Wir zuerst alle lesen die Eigenschaftsnamen aus der Klasse T unter Verwendung der Reflexion
dann durchlaufen wir alle Zeilen in der Datentabelle und erstellen ein neues Objekt von T,
dann legen wir die Eigenschaften des neu erstellten Objekts durch Reflexion fest.
Die Eigenschaftswerte werden aus der übereinstimmenden Spaltenzelle der Zeile ausgewählt.
PS: Klasse Eigenschaftsnamen und Tabellenspaltennamen müssen identisch sein
Warum brauchen Sie es * in einer Zeile *? ist die aktuelle multi-lined form genauso einfach zu lesen? –
@JensKloster was ist der Schaden in Wissen, wenn es in einer Zeile geschrieben werden könnte :) – iJade