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

时间:2019-10-04 03:36:25

标签: c#

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

函数需要一个参数,该参数是在“使用块”中实例化的实体框架DbContext。出现警告“进入已关闭的封盖”

using (var context = new DbContext())
{
   var fileDeletionProcedure = new List<Action>
   {
       () => _proc.deleteUsers(Id, context),
       () => _proc.deleteAccounts(Id, context),
       () => _proc.deleteMoney(Id, context)
   }
   foreach (var f in fileDeletionProcedure)
   {
       var exit = f.Invoke();
       if (exit)
       {
           break;
       }
   }
}

我想做类似我提供的代码的操作,但是Invoke()返回void,有人建议吗?另外,我将如何处理有关已关闭封包的警告?

谢谢。

2 个答案:

答案 0 :(得分:1)

答案是将Action替换为Func<bool>Predicate,但是这段代码看起来很奇怪。您会收到警告,因为编译器不知道您是否打算在using块中执行这些操作。如果之后执行此操作,则上下文将已经被处理。如果不这样做,则可以简单地忽略此警告(带有正当理由的评论)。

正确的方法很简单:

using (var context = new DbContext())
{
    if (_proc.deleteUsers(Id, context)
        || _proc.deleteAccounts(Id, context)
        || _proc.deleteMoney(Id, context))
    {
        return;
    }
}

||将尽快退出,因此如果deleteUsers返回true,它将不会执行deleteAccountsdeleteMoney

但这看起来仍然很奇怪,因为没有任何迹象表明deleteXXX函数会在发生错误的情况下返回true。您应该扭转这种逻辑,并使用&&代替||

答案 1 :(得分:1)

这只是一个警告,提醒您可能做错了事,很明显这些操作将在上下文中执行,并且不会被处理。

如果这是 harshaper 警告,您可以在注释中将其禁用

还请注意,操作不会返回结果,您将需要使用Func<bool>

// ReSharper disable AccessToDisposedClosure
var fileDeletionProcedure = new List<Func<bool>>
                            {
                               () => Something(db)
                            };
// ReSharper restore AccessToDisposedClosure


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