退货方法清单

时间:2012-07-23 23:14:43

标签: c# asp.net

我正在寻找以下模式:

我有几种这样的方法:
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 个答案:

答案 0 :(得分: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
        }
    }
    

答案 1 :(得分:2)

使用Func<bool>而不是ActionFunc适用于返回值的代理。

答案 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将是假的。