C# 调用函数列表。如何获取它们的返回值并使用可能是已处理闭包的一部分的参数?

C# 调用函数列表。如何获取它们的返回值并使用可能是已处理闭包的一部分的参数?,c#,C#,我想调用一个函数列表。所有函数都返回bool。根据bool,我想中断调用函数列表中每个函数的循环 这些函数需要一个参数,该参数是实体框架DbContext,在“使用块”中实例化。有一个警告“访问已处理的关闭” 使用(var context=new DbContext()) { var fileDeletionProcedure=新列表 { ()=>_proc.deleteUsers(Id、上下文), ()=>_过程删除帐户(Id、上下文), ()=>_proc.deleteMoney(Id,co

我想调用一个函数列表。所有函数都返回bool。根据bool,我想中断调用函数列表中每个函数的循环

这些函数需要一个参数,该参数是实体框架DbContext,在“使用块”中实例化。有一个警告“访问已处理的关闭”

使用(var context=new DbContext())
{
var fileDeletionProcedure=新列表
{
()=>_proc.deleteUsers(Id、上下文),
()=>_过程删除帐户(Id、上下文),
()=>_proc.deleteMoney(Id,context)
}
foreach(fileDeletionProcedure中的变量f)
{
var exit=f.Invoke();
如果(退出)
{
打破
}
}
}
我想做一些类似于我提供的代码的事情,但是
Invoke()
返回void,有人有建议吗?另外,我将如何处理关于已处置关闭的警告


提前感谢。

答案是将
操作
替换为
Func
谓词
,但此代码看起来很奇怪。您会收到一条警告,因为编译器不知道您是否要在使用块时执行这些操作。如果在之后执行此操作,则上下文将已被释放。如果你不这样做-你可以忽略这个警告(放一个有理由的评论)

正确的方法很简单:

using (var context = new DbContext())
{
    if (_proc.deleteUsers(Id, context)
        || _proc.deleteAccounts(Id, context)
        || _proc.deleteMoney(Id, context))
    {
        return;
    }
}
|
将尽快退出,因此如果
deleteUsers
返回
true
它将不会执行
deleteAccounts
deleteMoney


但这看起来仍然很奇怪,因为没有任何迹象表明,如果出现错误,
deleteXXX
函数将返回
true
。你应该颠倒这个逻辑,使用
&&
而不是
|

答案是用
Func
谓词
替换
操作
,但是这个代码看起来很奇怪。您会收到一条警告,因为编译器不知道您是否要在使用块时执行这些操作。如果在之后执行此操作,则上下文将已被释放。如果你不这样做-你可以忽略这个警告(放一个有理由的评论)

正确的方法很简单:

using (var context = new DbContext())
{
    if (_proc.deleteUsers(Id, context)
        || _proc.deleteAccounts(Id, context)
        || _proc.deleteMoney(Id, context))
    {
        return;
    }
}
|
将尽快退出,因此如果
deleteUsers
返回
true
它将不会执行
deleteAccounts
deleteMoney

但这看起来仍然很奇怪,因为没有任何迹象表明,如果出现错误,
deleteXXX
函数将返回
true
。您应该反转此逻辑,使用
&&
而不是
| |

这只是一个警告,提醒您可能做了错误的事情,显然操作将在上下文中执行,不会被处理

如果这是一个重竖琴警告,您可以通过注释禁用它

还要注意,操作不会返回结果,您需要使用
Func

//ReSharper禁用访问disposedclosure
var fileDeletionProcedure=新列表
{
()=>某物(db)
};
//ReSharper还原访问DisposedClosure
foreach(fileDeletionProcedure中的变量f)
{
if(f.Invoke())
打破
}
这只是一个警告,提醒您可能做了错误的事情,显然操作将在上下文中执行,并且不会被处理

如果这是一个重竖琴警告,您可以通过注释禁用它

还要注意,操作不会返回结果,您需要使用
Func

//ReSharper禁用访问disposedclosure
var fileDeletionProcedure=新列表
{
()=>某物(db)
};
//ReSharper还原访问DisposedClosure
foreach(fileDeletionProcedure中的变量f)
{
if(f.Invoke())
打破
}
// ReSharper disable AccessToDisposedClosure
var fileDeletionProcedure = new List<Func<bool>>
                            {
                               () => Something(db)
                            };
// ReSharper restore AccessToDisposedClosure


foreach (var f in fileDeletionProcedure)
{
   if (f.Invoke())
      break;
}