检查函数集合是否等于false

时间:2011-11-03 14:05:19

标签: c# asp.net

我有一组方法可以在结果上带来真/假的延迟。 我有一个3-4个方法的集合,如果其中任何一个返回false,则抛出错误。

但要检查这些,我能想到的就是

if(!myfunction) OR (!myOtherFunction) OR (!myOtherOtherFunction) 
return error

基本上堆叠在彼此的检查上。 有没有办法让我更加睿智地做到这一点?

4 个答案:

答案 0 :(得分:1)

如果他们正在评估布尔值,那么方法应该只返回true或false。 如果您想实际捕获错误,请捕获错误。有关更多原因,请参阅the answers to this question

使用异常处理,让函数抛出异常。 然后,您的周围代码陷阱(特定)异常,并适当地处理它们。

try {
  myfunction();
  myOtherFunction();
  myOtherOtherFunction();
}
catch (MyCustomException ce) {
  // do something specific with a specific error
}
catch (Exception ex) {
  // do something with the exception
}

答案 1 :(得分:1)

如果Method1,Method2,Method3(例如)都具有相同的签名(采用相同的类型参数,返回bool),您可以:

bool Method1(YourParamType arg) { }
bool Method2(YourParamType arg) { }    
bool Method3(YourParamType arg) { }

...

List<Func<YourParamType, bool>> validators = new List<Func<YourParamType, bool>>
    {
        Method1,
        Method2,
        Method3
    }

...

if (!validators.All(m => m(arg)) return error;

如果您的方法不采用参数,则只需更改为Func<bool>

bool Method1() { }    
bool Method2() { }    

bool Method3(){}

...

List<Func<bool>> validators = new List<Func<bool>>
    {
        Method1,
        Method2,
        Method3
    }

...

if (!validators.All(m => m()) return error;

同样,如果方法采用多个arg,则可以使用Func<YourParamType1, YourParamType2, bool>等。

如果他们有不同的签名,你可以全部内联,但它变得丑陋:

if (!new Func<bool>[] { () => Method1(arg1), () => Method2(arg1, arg2), () => Method3() }.Any())
    return error;

答案 2 :(得分:0)

如果您想报告错误发生的详细信息,您可以这样做:

  bool error = false;
    string messageError = "An erorr has occured with :";

    if (!oneMethod())
    {
        error = true;
        messageError += "\n an error occured has occured with method one";
    }

if (!twoMethod())
    {
        error = true;
        messageError += "\n an error occured has occured with method two";
    }

if (error)
 DisplayError(messageError);

否则你可以在第一次发现错误时返回。 您可以将所有这些封装在validate方法中。

答案 3 :(得分:0)

Func<bool> foo1 = ...
Func<bool> foo2 = ...
Func<bool> foo3 = ...
var foos = new List<Func<bool>> {foo1, foo2, foo3};
bool error = foos.Any(foo => !foo());