我有一组方法可以在结果上带来真/假的延迟。 我有一个3-4个方法的集合,如果其中任何一个返回false,则抛出错误。
但要检查这些,我能想到的就是
if(!myfunction) OR (!myOtherFunction) OR (!myOtherOtherFunction)
return error
基本上堆叠在彼此的检查上。 有没有办法让我更加睿智地做到这一点?
答案 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());