C#Lambda表达式或代理作为属性或参数我想创建一个ValidationRule类来验证实体类型对象的属性。我真的很想设置要检查的属性的名称,然后为类提供一个委托或lambda表达式,当对象运行其IsValid()方法时,将在运行时对其进行评估。有没有人有这样的片段,或者关于如何将匿名方法作为参数或属性传递的任何想法?另外,我不确定我是否在解释我想要完成的事情,所以如果我不清楚,请提问。实际上,您要使用的是Func,其中T是您要验证的项目类型。然后你会做这样的事情validator.AddValidation(item=>(item.HasEnoughInformation()||item.IsEmpty());你可以将它们存储在列表中>。_v;publicValidationRule(Validatorv){_v=v;}publicValidatorValidator{get{return_v;}set{_v=value;}}publicboolIsValid{get{return_v();}}}varalwaysPasses=newValidationRule(()=>true);varalwaysFails=newValidationRule(()=>false);vartextBoxHasText=newValidationRule(()=>textBox1.Text.Length>0);这应该让你开始。但是,真的是的,继承在这里更合适。问题很简单,Validator无法访问任何它没有关闭的状态,这意味着它不能像ValidationRules那样可重用,ValidationRules包含自己的状态。用前面定义的textBoxHasText替换下面的类来替换textBoxHasText。接口IValidationRule{boolIsValid{get;}}类BoxHasText:IValidationRule{TextBox_c;publicBoxHasText(TextBoxc){_c=c;}publicboolIsValid{get{return_c.Text.Length>0;}}},简单地说,如果你有一个Entity类,并且你想在该Entity上使用lambda表达式来确定某些东西是否有效(返回一个布尔值),你可以使用Func。因此,给定一个实体:classEntity{publicstringMyProperty{get;放;您可以为此定义一个ValidationRule类:classValidationRulewhereT:Entity{privateFunc_rule;publicValidationRule(Funcrule){_rule=rule;}publicboolIsValid(Tentity){return_rule(entity);然后你可以像这样使用它:varmyEntity=newEntity(){MyProperty="HelloWorld"};varrule=newValidationRule(entity=>entity.MyProperty=="HelloWorld");varvalid=rule.IsValid(myEntity);当然,这只是一种可能的解决方案。如果您删除上面的通用约束(“whereT:Entity”),您可以使它成为一个可以与任何POCO一起工作的通用规则引擎。您不必为每个需要的用途派生一个类。因此,如果我想在TextBox上使用相同的类,我可以使用以下内容(在删除通用约束之后):varrule=newValidationRule(tb=>tb.Text.Length>0);rule.IsValid(myTextBox);这种方法非常灵活。将lambda表达式和泛型一起使用非常强大。您可以接受Expression>或Expression>而不是Func或Action,并且可以直接访问表达式树以自动调查方法或属性的名称、表达式的表达方式等。使用您的课程的人不必更改一行代码。类似于:classValidationRule{privateFuncvalidation;publicValidationRule(Funcvalidation){this.validation=validation;}publicboolIsValid(){返回验证();将是更多C#3风格,但编译成与@FrankKrueger的答案相同的代码。这就是你的要求,但感觉不对。为什么不能扩展实体来执行验证有充分的理由吗?这样的规则定义语法适合您吗?publicstaticvoidValid(Addressaddress,IScopescope){scope.Validate(()=>address.Street1,StringIs.Limited(10,256));scope.Validate(()=>address.Street2,StringIs.Limited(256));scope.Validate(()=>address.Country,Is.NotDefault);scope.Validate(()=>address.Zip,StringIs.Limited(10));switch(address.Country){caseCountry.USA:scope.Validate(()=>address.Zip,StringIs.Limited(5,10));休息;案例Country.France:break;caseCountry.Russia:scope.Validate(()=>address.Zip,StringIs.Limited(6,6));休息;默认值:scope.Validate(()=>address.Zip,StringIs.Limited(1,64));休息;}更多信息参见.NETDDD和规则驱动的UIvalidation以上是C#学习教程的全部内容:C#Lambda表达式或代理作为属性或参数。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
