gpt4 book ai didi

c# - 将来自数据阅读器的行转换为类型化结果

转载 作者:IT王子 更新时间:2023-10-29 04:15:11 24 4
gpt4 key购买 nike

我正在使用返回数据读取器的第三方库。我想要一种尽可能通用的简单方法,将其转换为对象列表。
例如,假设我有一个具有 2 个属性 EmployeeId 和 Name 的类“Employee”,我希望将数据读取器(包含员工列表)转换为 List
我想我别无选择,只能遍历数据读取器的行,并将它们中的每一行转换为我将添加到列表中的 Employee 对象。有更好的解决方案吗?我使用的是 C# 3.5,理想情况下我希望它尽可能通用,以便它适用于任何类(DataReader 中的字段名称与各种对象的属性名称相匹配)。

最佳答案

您真的需要一个列表,还是 IEnumerable 就足够了?

我知道您希望它是通用的,但更常见的模式是在接受数据行(或 IDataRecord)的目标对象类型上使用静态工厂方法。这看起来像这样:

public class Employee
{
public int Id { get; set; }
public string Name { get; set; }

public static Employee Create(IDataRecord record)
{
return new Employee
{
Id = record["id"],
Name = record["name"]
};
}
}

.

public IEnumerable<Employee> GetEmployees()
{
using (var reader = YourLibraryFunction())
{
while (reader.Read())
{
yield return Employee.Create(reader);
}
}
}

然后,如果您真的需要一个列表而不是 IEnumerable,您可以对结果调用 .ToList()。我想您也可以使用泛型 + 委托(delegate)来使此模式的代码也更易于重用。

更新:我今天又看到了这个,感觉要写通用代码了:

public IEnumerable<T> GetData<T>(IDataReader reader, Func<IDataRecord, T> BuildObject)
{
try
{
while (reader.Read())
{
yield return BuildObject(reader);
}
}
finally
{
reader.Dispose();
}
}

//call it like this:
var result = GetData(YourLibraryFunction(), Employee.Create);

关于c# - 将来自数据阅读器的行转换为类型化结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1202935/

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