1

我正在寻找以下模式:

我有几种这样的方法:
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,我需要禁止运行下一个方法(但并非总是如此,只是在某些情况下)。

4

4 回答 4

3

Action 只是一个委托,它被设计为在没有返回类型的情况下使用

但是您可以将Action委托更改为Func委托

public Func<bool> method {get; set;}

此外,如果先前返回 false,我需要禁止运行下一个方法(但并非总是如此,只是在某些情况下)。

解决此问题的一种方法是:

  1. 向您的类添加一个属性,以确定如果返回类型不为真,是否应运行下一个方法

    public bool RunNextMethodIfConditionFails {get; set;}
    
  2. 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
        }
    }
    
于 2012-07-23T23:19:14.263 回答
2

使用Func<bool>而不是Action. Func适用于返回值的委托。

于 2012-07-23T23:18:47.183 回答
1

使用接受返回类型的委托Func<T, TResult>

于 2012-07-23T23:19:55.313 回答
0

改用 Func

公共类 CheckingMethod { 公共字符串名称 {get; 设置;} 公共函数方法 {get; set;} public bool 成功 { 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 如果失败则为假。

于 2012-07-23T23:24:57.863 回答