我正在使用返回数据读取器的第三方库。我想要一种简单且尽可能通用的方法将其转换为对象列表。
例如,假设我有一个类“Employee”,它有 2 个属性 EmployeeId 和 Name,我希望将数据读取器(其中包含员工列表)转换为 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);
}
}
}
那么如果你really需要一个列表而不是一个可以调用的 IEnumerable.ToList()
关于结果。我想您还可以使用泛型+委托来使该模式的代码更可重用。
Update:今天又看到这个,有种想写下遗传密码的感觉:
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)