实际上它不一定是一个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()
执行时枚举尚未处理。
调用.ToList()
return fromGetObjects
是实际执行枚举的内容,但到那时连接已经被破坏并且IDataReader
失败。
在我的实例CloseDBConnections
中,不能从新ProcessReader
函数中调用,因为它IDataReader
可能来自其他来源(在这个实例中重构的重点)
是否有合理的解决方法,或者我是否必须复制枚举代码?
我尝试调用ProcessReader
asyield return
而不是,return
但这不起作用,因为 C#(可以理解)认为我正在尝试将一个添加IEnumerable
到IEnumerable
!