作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用返回数据读取器的第三方库。我想要一种尽可能通用的简单方法,将其转换为对象列表。
例如,假设我有一个具有 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/
我是一名优秀的程序员,十分优秀!