【发布时间】:2013-07-25 08:33:28
【问题描述】:
其实不一定是IDataReader。
我有一个类似这样的函数:
public IEnumerable<MyClass> GetObjects()
{
IDataReader dr = GetSomeDataReader();
while (dr.Read())
{
yield return new MyClass(dr);
}
CloseDBConnections();
}
在我像这样重构它之前,这一切正常:
public IEnumerable<MyClass> GetObjects()
{
IDataReader dr = GetSomeDataReader();
try
{
return ProcessReader(dr);
} finally {
CloseDBConnections();
}
}
public IEnumerable<MyClass> ProcessReader(IDataReader dr)
{
while (dr.Read())
{
yield return new MyClass(dr);
}
}
这不起作用,因为在执行CloseDBConnections() 时,尚未处理枚举。
在从GetObjects 返回时调用.ToList() 是实际执行枚举的操作,但到那时连接已经被破坏并且IDataReader 失败。
在我的实例中,CloseDBConnections 不能从新的 ProcessReader 函数中调用,因为 IDataReader 可能来自其他来源(在此实例中重构的重点)
对此是否有合理的解决方法,或者我是否必须复制枚举代码?
我尝试将ProcessReader 调用为yield return 而不是return,但这不起作用,因为C#(可以理解)认为我正在尝试将IEnumerable 添加到IEnumerable!
【问题讨论】:
标签: c# ienumerable yield-return