有两个大问题:
- 您无法指定需要参数的构造函数约束
- 您的方法目前不是通用的 - 它应该是
PopulateCollection<T>
而不是PopulateCollection
。
您已经有了一个约束 T : BusinessBase
,所以为了解决第一个问题,我建议您在 BusinessBase
中添加一个抽象 (或虚拟) 方法:
public abstract void PopulateFrom(DataRow dr);
此外,还需要在
T
上添加一个无参数构造函数约束。
您的方法将变为:
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;
}
如果您使用的是.NET 3.5,您可以使用
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();
}
或者,您可以将其作为扩展方法本身(再次假设.NET 3.5),并传递一个函数来返回实例:
static List<T> ToList<T>(this DataTable dt, Func<DataRow dr, T> selector)
where T: BusinessBase
{
return dt.AsEnumerable().Select(selector).ToList();
}
您的来电者会这样写道:
...
table.ToList(row => new Whatever(row));
假设您回到拥有一个接受 DataRow
的构造函数。这样做有利于编写不可变类(以及没有无参数构造函数的类),但这也意味着您不能通用地工作,除非还具有“工厂”功能。