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);

次に、次のように1つずつ実行できます。

foreach (CheckingMethod cm in cms)
{
    cm.method()
}

残念ながら、Actionはvoid型のみを返すため、メソッドがfalseまたはtrueを返したかどうかを判断する方法がありません。また、前にfalseが返された場合は、次のメソッドの実行を禁止する必要があります(ただし、常にではありませんが、場合によっては)。

4

4 に答える 4

3

アクションは単なる委任であり、リターンタイプなしで使用するように設計されています

Actionただし、デリゲートをデリゲートにFunc変更することはできます

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

また、前にfalseが返された場合は、次のメソッドの実行を禁止する必要があります(ただし、常にではありませんが、場合によっては)。

これを解決する1つの方法は次のとおりです。

  1. クラスにプロパティを追加して、戻り値の型がtrueでない場合に次のメソッドを実行する必要があるかどうかを識別します

    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; set;}publicFuncメソッド{get; set;} 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が失敗すると、falseになります。

于 2012-07-23T23:24:57.863 に答える