当前位置: 首页 > 编程语言 > C#

无法从一组表达式创建复合表达式<Func >分享

时间:2023-04-11 00:35:19 C#

C#学习教程:无法从一组表达式中创建复合表达式Func委托给ExpressionTree,它允许我传入一个值(在本例中为badValue)并在谓词全部返回true并考虑二进制操作时获取bool。这是我第一次使用Expression/ExpressionTrees,所以请保持温和。我收到此错误:ArgumentException:无法在此行调用“System.Boolean”类型的表达式:collectAnswers=Expression.And(isEmpty.Body,Expression.Invoke(...我已设置该行,因为我需要共享一个在所有表达式中引用值(对吗?)。我的理想情况是只有一堆Expression我可以将它们与逻辑运算符(and/or/not)一起传递给系统,并在结束。希望能够动态构建值必须通过的规则。在我要走的道路上这可能吗?如果没有,将不胜感激一些指向我正确道路的指示。stringbadValue="你好!";constintminSize=8;constintmaxSize=30;表达式stringLengthMax=value=>value.LengthstringLengthMin=value=>value.Length>minSize;表达式isEmpty=value=>!string.IsNullOrEmpty(value);BinaryExpressioncollectAnswers=Expression.And(stringLengthMax.Body,Expression.Invoke(stringLengthMin,stringLengthMax.Parameters));collectAnswers=Expression.And(isEmpty.Body,Expression.Invoke(collectAnswers,stringLengthMax.Parameters));FuncshouldValidate=Expression.Lambda(collectAnswers,stringLengthMax.Parameters).Compile();boolresult=shouldValidate(badValue);answer我没有以正确的方式推进参数,下面是一个示例,多个参数在放入ExpressionTree的多个表达式和来自已编译Func的单个布尔值之间共享,isValidconstintminSize=8;constintmaxSize=30;ExpressionstringLengthMax=(value,max)=>value.Length<=max;表达式stringLengthMin=(value,min)=>value.Length>=min;表达式isEmpty=value=>string.IsNullOrEmpty(value);ParameterExpressionvalueParameter=Expression.Parameter(typeof(string));ParameterExpressionminParameter=Expression.Parameter(typeof(int));ParameterExpressionmaxParameter=Expression.Parameter(typeof(int));ExpressionminMaxCheck=Expression.Lambda(Expression.And(Expression.Invoke(stringLengthMax,valueParameter,maxParameter),Expression.Invoke(stringLengthMin,valueParameter,minParameter)),valueParameter,minParameter,maxParameter);minMaxCheck=Expression.Lambda(Expression.And(Expression.Invoke(minMaxCheck,valueParameter,minParameter,maxParameter),Expression.Not(Expression.Invoke(isEmpty,valueParameter))),valueParameter,minParameter,maxParameter);FuncisValid=minMaxCheck.Compile();boolresultFalse1=isValid("你好!",minSize,maxSize);//false-布尔值太短resultTrue1=isValid("hello!","hello!".Length,maxSize);//true-调整minboolresultFalse2=isValid("1234567890123456789012345678901",minSize,maxSize);//false-太长boolresultTrue2=isValid("1234567890123456789012345678901",minSize,"1234567890123456789012345678901".Length);//true-调整最大boolresultFalse3=isValid(string.Empty,minSize,maxSize);//false-空boolshouldBeTrue=isValid("1234567890",minSize,maxSize);//true-正好boolresultFalse4=isValid("1234567890",maxSize,maxSize);//false-调整minboolresultFalse5=isValid("1234567890",minSize,minSize);//false-如果你想用表达式来做这个,那么调整最大值,然后像这样的东西会起作用,尽管你可以构建它,这不会短路。你很亲密。您需要将参数表达式贯穿整个参数树。stringbadValue="你好!";constintminSize=8;constintmaxSize=30;表达式>stringLengthMax=value=>value.Length>stringLengthMin=value=>value.Length>minSize;表达式>isEmpty=value=>!string.IsNullOrEmpty(value);ParameterExpressionpe=Expression.Parameter(typeof(string));varx=Expression.Lambda>(Expression.And(Expression.Invoke(stringLengthMax,pe),Expression.And(Expression.Invoke(stringLengthMin,pe),Expression.Invoke(isEmpty,pe))),pe);FuncshouldValidate=x.Compile();boolresultFalse1=shouldValidate("你好!");boolresultFalse2=shouldValidate("1234567890123456789012345678901");//boolresultFalse3=shouldValidate(null);抛出异常,因为你不能这样做(null).LengthboolshouldBeTrue=shouldValidate("123456789");//查看结果的LinqPad代码:resultFalse1.Dump();resultFalse2.Dump();//resultFalse3.Dump();shouldBeTrue.Dump();在我看来,你根本不需要构建表现形式树。您可以使用简单的linq编写函数(将它们定义为Func,而不是Expression>):FuncshouldValidate=arg=>new[]{stringLengthMax,stringLengthMin,isEmpty}.All(func=>func(arg))如果你想用的不仅仅是and,你可以在逻辑上组合你的func:以上是C#学习教程:Can'tcreateacompoundexpressionfromasetofexpressions分享所有内容,如果有用大家还有需要了解更多C#学习教程,希望大家多多关注——FuncshouldValidate=arg=>isEmpty(arg)||(stringLengthMax(arg)&&stringLengthMin(arg));本文收集自网络,不代表立场。侵权请点击右侧联系管理员删除。如需转载请注明出处: