2010-10-13 71 views
3

所以我最近學會了使用Func Delegate和Lambda表達式的新技巧,以避免在我的代碼中多次驗證if語句。錯誤檢查使用Func委託

因此,代碼看起來像

public static void SetParameters(Dictionary<string,object> param) 
     { 
      Func<Dictionary<string, object>, bool>[] eval = 
      { 
       e => e != null , 
       e => e.Count ==2 , 
       e => e.ContainsKey("Star"), 
       e => e.ContainsKey("Wars") 
      }; 

      var isValid = eval.All(rule => rule(param)); 

      Console.WriteLine(isValid.ToString()); 
     } 

,但我的下一個步驟是我希望做一些錯誤檢查爲好。因此對於例如如果在我之前的例子中計數!= 2,我想編寫一些錯誤集合以獲得更清晰的異常。

所以我一直想知道如何使用類似的Func和Lamdba符號來實現該功能?

我拿出我的規則檢查類

public class RuleChecker 
    { 
     public Dictionary<string, object> DictParam 
     { 
      get; 
      set; 
     } 

     public string ErrorMessage 
     { 
      get; 
      set; 
     } 
    } 

有人可以幫爲我怎樣才能做到這一點?

回答

2

,你可以這樣做:

 List<string> errors = new List<string>(); 
     Func<Dictionary<string, object>, bool>[] eval = 
     { 
      e => { bool ret = e != null; if (!ret) errors.Add("Null"); return ret; }, 

然而一個更優雅的解決辦法是

 List<string> errors = new List<string>(); 
     Func<bool, string, List<string>, bool> EvaluateWithError = (test, message, collection) => 
     { 
      if (!test) collection.Add(message); return test; 
     }; 

     Func<Dictionary<string, object>, bool>[] eval = 
     { 
      e => EvaluateWithError(e != null, "Null", errors), 
+0

尼斯。但是,在第二種解決方案中,這不應該是(!測試)嗎? – 2010-10-13 08:23:19

+0

haha​​hah是 - 謝謝! – 2010-10-13 08:47:00

+0

感謝Preet,這工作。但我想知道是否有像EvaluteWithError Delegate這樣的更通用的方法,而不是類,我可以重複使用它,而不是每次在每個類中創建Func <...>? – netmatrix01 2010-10-13 10:40:02