Il y a deux grands problèmes:
- Vous ne pouvez pas spécifier une contrainte de constructeur qui prend un paramètre
- Votre méthode est pas générique - il devrait être
PopulateCollection<T>
au lieu de PopulateCollection
.
Vous avez déjà une contrainte qui T : BusinessBase
, afin de contourner le premier problème, je vous suggère d'ajouter un résumé (ou virtuel) méthode BusinessBase
:
public abstract void PopulateFrom(DataRow dr);
ajouter également une contrainte constructeur parameterless à T
.
Votre méthode peut alors devenir:
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;
}
Si vous utilisez .NET 3.5, vous pouvez faire cela en utilisant un peu plus simple la méthode d'extension dans DataTableExtensions
:
protected List<T> PopulateCollection<T>(DataTable dt)
where T: BusinessBase, new()
{
return dt.AsEnumerable().Select(dr =>
{
T t = new T();
t.PopulateFrom(dr);
}.ToList();
}
Sinon, vous pourriez en faire une méthode d'extension elle-même (encore une fois, en supposant .NET 3.5) et transmettre une fonction pour retourner les instances:
static List<T> ToList<T>(this DataTable dt, Func<DataRow dr, T> selector)
where T: BusinessBase
{
return dt.AsEnumerable().Select(selector).ToList();
}
Vos correspondants seraient alors écrire:
table.ToList(row => new Whatever(row));
Cela suppose que vous retournerez à avoir un constructeur de prendre un DataRow
. Cela a l'avantage de vous permettre d'écrire des classes immuables (et celles qui n'ont pas de constructeur sans paramètre) mais cela signifie que vous ne pouvez pas travailler de façon générique sans avoir la fonction "factory".
+1 effacer sur les questions, et pour la dernière version. Je ne pense pas que la version intermédiaire soit beaucoup plus simple que le foreach dans ce cas. – eglasius
Je n'ai pas le pouvoir d'éditer, donc quiconque peut, changer retourner dt.Rows.AsEnumerable(). Sélectionner (sélecteur) .ToList(); à return dt.AsEnumerable(). Sélectionnez (sélecteur) .ToList(); depuis AsEnumerable est une méthode d'extension sur le DataTable pas sur la collection .Rows. – AngryHacker
@AngryHacker: Merci, c'est fait. –