2010-10-13 69 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