gpt4 book ai didi

c# - 如何在泛型方法中有效地创建对象列表?

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

所以,我有一个基于数据库的应用程序。到目前为止,我的查询结果都进入了一个 DataTable 对象,如下所示:

DataTable data = new DataTable();
data.Load(someQuery.ExecuteReader());

现在,我想将我的数据加载到一个强类型对象列表中。像这样:

List<MyClass> data = someQuery.Load<MyClass>();

但是,我第一次尝试编写该方法时,运行速度几乎比 DataTable.Load(IDataReader) 方法慢三倍。基本上,我有用户 GetConstructor(null).Invoke(null) 来创建和对象,我使用 PropertyInfo.SetValue(reader.GetValue()) 来填充数据。

有更好的方法吗?

使用的方法:

    public List<T> LoadData<T>(DbCommand query)
{
Type t = typeof(T);

List<T> list = new List<T>();
using (IDataReader reader = query.ExecuteReader())
{
while (reader.Read())
{
T newObject = (T)t.GetConstructor(null).Invoke(null);

for (int ct = 0; ct < reader.FieldCount; ct++)
{
PropertyInfo prop = t.GetProperty(reader.GetName(ct));
if (prop != null)
prop.SetValue(newObject, reader.GetValue(ct), null);
}

list.Add(newObject);
}
}

return list;
}

最佳答案

要有效地做到这一点,需要元编程。您可以使用图书馆来提供帮助。例如,“FastMember”包括一个 TypeAccessor,它提供对实例创建的快速访问和按名称的成员访问。然而,这个例子基本上也正是“dapper”的工作方式,所以你可以使用dapper:

int id = ...
var data = connection.Query<Order>(
"select * from Orders where CustomerId = @id",
new { id }).ToList();

你也可以打开“dapper”代码看看它做了什么。

关于c# - 如何在泛型方法中有效地创建对象列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18929781/

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