Es gibt zwei große Probleme:
- Sie können keine Konstruktoreinschränkung angeben, die einen Parameter
- Ihre Methode ist nicht generisch nimmt - es
PopulateCollection<T>
statt PopulateCollection
sein sollte.
Sie haben bereits eine Einschränkung, dass T : BusinessBase
, so um das erste Problem zu bekommen empfehle ich Ihnen eine Zusammenfassung hinzufügen (oder virtuelle) Methode in BusinessBase
:
public abstract void PopulateFrom(DataRow dr);
auch einen parameter Konstruktoreinschränkung hinzufügen zu T
.
Ihre Methode kann dann worden:
protected List<T> PopulateCollection<T>(DataTable dt)
where T: BusinessBase, new()
{
return dt.AsEnumerable().Select(dr =>
{
T t = new T();
t.PopulateFrom(dr);
}.ToList();
}
Alternativ könnten Sie:
protected List<T> PopulateCollection(DataTable dt)
where T: BusinessBase, new()
{
List<T> lst = new List<T>();
foreach (DataRow dr in dt.Rows)
{
T t = new T();
t.PopulateFrom(dr);
lst.Add(t);
}
return lst;
}
Wenn Sie .NET 3.5 verwenden sind, werden Sie diese etwas einfacher mit der Erweiterungsmethode in DataTableExtensions
machen machen Sie es selbst zu einer Erweiterungsmethode (wieder unter der Annahme von .NET 3.5) und übergeben Sie eine Funktion zum Zurückgeben von Instanzen:
static List<T> ToList<T>(this DataTable dt, Func<DataRow dr, T> selector)
where T: BusinessBase
{
return dt.AsEnumerable().Select(selector).ToList();
}
Ihre Anrufer würde dann schreiben:
table.ToList(row => new Whatever(row));
Dies setzt voraus, Sie gehen einen Konstruktor mit einem DataRow
nehmen. Dies hat den Vorteil, dass Sie unveränderliche Klassen schreiben können (und solche, die keinen parameterlosen Konstruktor haben), aber das bedeutet, dass Sie nicht generisch arbeiten können, ohne auch die "Factory" -Funktion zu haben.
+1 klar auf die Probleme, und für die letzte Version. Ich denke nicht, dass die Zwischenversion in diesem Fall viel einfacher ist als die Foreach. – eglasius
Ich habe nicht die Macht zu bearbeiten, so dass jeder, der kann, ändern Rückgabe dt.Rows.AsEnumerable(). Wählen Sie (Selektor) .ToList(); bis Rückgabe dt.AsEnumerable(). Wählen Sie (Selektor) .ToList(); seit AsEnumerable ist eine Erweiterung Methode für die DataTable nicht in der .Rows-Auflistung. – AngryHacker
@AngryHacker: Danke, fertig. –