gpt4 book ai didi

c# - DataTable into List *without* where T : class, new() - 潜在问题?

转载 作者:太空宇宙 更新时间:2023-11-03 19:35:37 24 4
gpt4 key购买 nike

今天早上我一直在寻找 SO,以找到一种从 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;
}

注意:我希望返回一个空列表,因为大多数情况下它只是绑定(bind)到数据网格、中继器等。

但是,它不起作用,因为类通常有一个私有(private)构造函数来防止未经授权的实例化(我的意思是那样),所以我得到“类型'typename'必须是具有公共(public)属性的非抽象类型无参数构造函数”错误。

我不愿意在我的类中引入一个公共(public)的无参数构造函数,因为它们包含 90% 的静态方法(与 ObjectDataSources 一起使用)并且创建一个“空”类是没有意义的。 IE。一个新的 Employee 对象将是空白的,而不是由 public static Employee Get(string employeeID) 创建的,后者将包含更多有用的信息。

关于如何在 '????' 处创建 T 的“事物”的任何想法标记行而不使用 new() 约束?我可以通过类型参数实例化“事物”吗?

感谢您的任何想法,只是尝试通过让这个...在我的应用程序中干燥

亲切的问候,

迈克·K。

PS 是的,也许 dt.Rows.Count > 0 调用是不必要的......

最佳答案

如前所述,Activator.CreateInstance 方法应该可以完成这项工作 - class, new() 是一个便利,并表达据我们所知,应该是这样的,当然...您有什么特别的理由不想要它吗?

另一种方法是传入工厂方法——这可能有助于解决任何 DI 问题等:

protected static List<T> ConvertTo<T>(DataTable dt, Func<T> ctor)
{
{loop}
T newItem = ctor();
{fill row}
{/loop}
}

然后您可以调用为(例如):

List<Person> people = ConvertTo<Person>(dataTable, () => new Person());

或:

List<Person> people = ConvertTo<Person>(
dataTable, () => diContainer.Create<Person>()); // for your DI service

关于c# - DataTable into List<T> *without* where T : class, new() - 潜在问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1789658/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com