我正在寻找以下模式:
我有几种这样的方法:
1. private bool CheckIfStringExist(string lookupString,ref string errorMessage)
2. private bool NumbersAreEqual(int one,int two,ref string errorMessage)
...
(大约15个)。
我想要做的是按特定顺序运行它们,并在任何失败的情况下向用户输出错误消息。另外,我想向用户显示方法友好名称。
到目前为止,我想出了以下内容。
我创建了一个类来分别保存每个方法:
public class CheckingMethod
{
public string name {get; set;}
public Action method {get; set;}
public bool success {get; set;}
public CheckingMethod(string name, Action method)
{
this.name= name;
this.method = method;
this.success = false;
}
}
这允许我将所有方法存储在列表中......如下所示:
List<CheckingMethod> cms = new List<CheckingMethod>();
cms.Add(new CheckingMethod("Check if text exist", ()=>CheckIfStringExist(lookupString, ref errorMessage);
cms.Add(new CheckingMethod ("Check if numbers are equal", ()=>NumbersAreEqual(num1, num2, ref errorMessage);
然后我可以像这样一个接一个地运行它们:
foreach (CheckingMethod cm in cms)
{
cm.method()
}
不幸的是,Action只返回void类型,所以我无法判断我的方法是返回false还是true。另外,如果之前返回false,我需要禁止运行下一个方法(但在某些情况下,并不总是如此)。
答案 0 :(得分:3)
Action只是一个委托,它的设计是在没有返回类型的情况下使用
但您可以更改Action
代理
Func
代理人
public Func<bool> method {get; set;}
另外,如果之前返回false,我需要禁止运行下一个方法(但在某些情况下,并不总是如此)。
解决此问题的一种方法是:
在您的类中添加一个属性,以确定如果返回类型不为真,是否应该运行下一个方法
public bool RunNextMethodIfConditionFails {get; set;}
在foreach
循环中检查此属性:
foreach (CheckingMethod cm in cms)
{
var res = cm.method();
if (!res && !cm.RunNextMethodIfConditionFails)
{
// react to this case, throw an exception or exit the loop using break
}
}
答案 1 :(得分:2)
使用Func<bool>
而不是Action
。 Func
适用于返回值的代理。
答案 2 :(得分:1)
使用接受返回类型的委托Func<T, TResult>
。
答案 3 :(得分:0)
改为使用Func
公共类CheckingMethod { 公共字符串名称{get;组;} public Func方法{get;组;} public bool success {get {return method(); }}
public CheckingMethod(string name, Func<Bool> method)
{
this.name= name;
this.method = method;
}
}
List<CheckingMethod> cms = new List<CheckingMethod>();
cms.Add(new CheckingMethod("Check if text exist", ()=>CheckIfStringExist(lookupString, ref errorMessage);
cms.Add(new CheckingMethod ("Check if numbers are equal", ()=>NumbersAreEqual(num1, num2, ref errorMessage);
bool AllOK=true;
foreach (var cm in cms) {
if (!cm.success) {
AllOK=false;
Debug.WriteLine("Failed on :" + cm.name);
break; // this stops the for loop
}
}
如果失败,AllOk将是假的。