【发布时间】:2009-11-24 12:08:06
【问题描述】:
今天早上我一直在寻找一种从 System.Data.DataTable 创建特定对象列表的方法。到目前为止,我的 DomainModel 基类中有这个:
protected static List<T> ConvertTo<T>(DataTable dt) where T : class, new()
{
int count = dt != null ? dt.Rows.Count : 0;
List<T> list = new List<T>(count);
if (dt != null & dt.Rows.Count > 0)
{
foreach (DataRow row in dt.Rows)
{
T item = new T(); // ????
FillObjectFromDataRow(item, row);
list.Add((T)item);
}
}
return list;
}
注意:我希望返回一个空列表,因为大多数情况下它只是绑定到数据网格、中继器等。
但是,它不起作用,因为类通常有一个私有构造函数来防止未经授权的实例化(我的意思是这样),所以我得到“类型'typename'必须是具有公共的非抽象类型无参数构造函数”错误。
我不愿意在我的类中引入公共无参数构造函数,因为它们包含 90% 的静态方法(与 ObjectDataSources 一起使用)并且创建一个“空”类是没有意义的。 IE。一个新的 Employee 对象将是空白的,而不是由 public static Employee Get(string employeeID) 创建的,后者将包含更多有用的信息。
关于如何在 '????' 处创建 T 的“事物”的任何想法标记行而不使用 new() 约束?我可以通过 Type parm 实例化一个“事物”吗?
感谢您的任何想法,只是尝试通过使用此功能在我的应用中干燥...
亲切的问候,
迈克·K。
PS 是的,也许 dt.Rows.Count > 0 调用是不必要的......
【问题讨论】:
-
FillObjectFromDataRow是做什么的?是使用反射从行映射到项目还是具有某些类型的专业知识?如果是后者,那么FillObjectFromDataRow就不能具备如何创建每种类型的专业知识吗? -
你好 Mike 二,它使用反射来映射行,所以它不是专门的。我更喜欢这种方式,尽可能通用(我认为,随时准备学习)。