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

如何将表达式树编译成可调用的C#方法?分享

时间:2023-04-10 13:52:30 C#

C#如何将表达式树编译成可调用方法?我有一个表达式树,它是通过使用C#中的表达式类解析Xml创建的。看到这个问题。我在我的表达式树中只加、减、除、乘、参数和求和。有没有办法将此ExpressionTree转换为可调用对象?...还是我必须手动触发IL?亲切的问候,以下是这两种方法的示例。让我知道我是否遗漏了什么,或者如果您想了解更多信息。staticvoidMain(){//尝试执行“x+(3*x)”varsingle=BuildSingle();varcomposite=BuildComposite();Console.WriteLine("{0}vs{1}",single(13.2M),composite(13.2M));}//将3作为正确类型的实用方法,因为并不总是存在“intxT”staticExpressionConvertConstant(TSourcevalue){returnExpression.Convert(Expression.Constant(value,typeof(TSource)),typeof(TDestination));}//选项1:单个表达式树;这是最有效的staticFuncBuildSingle(){varparam=Expression.Parameter(typeof(T),"x");表达式主体=Expression.Add(param,Expression.Multiply(ConvertConstant(3),param));varlambda=Expression.Lambda>(body,param);返回lambda.Compile();}//选项2:嵌套表达式树:staticFuncBuildComposite(){//第1步:进行乘法运算:varparamInner=Expression.Parameter(typeof(T),"inner");表达式bodyInner=Expression.Multiply(ConvertConstant(3),paramInner);变量lambdaInner=Expression.Lambda(bodyInner,paramInner);//第2步:执行添加,调用现有树varparamOuter=Expression.Parameter(typeof(T),"outer");表达式bodyOuter=Expression.Add(paramOuter,Expression.Invoke(lambdaInner,paramOuter));varlambdaOuter=Expression.Lambda>(bodyOuter,paramOuter);返回lambdaOuter.Compile();就个人而言,我的目标是第一种方法;它很简单并且有效可能涉及将原始参数传递到整个嵌套代码堆栈,仅此而已。我有一些代码采用“调用”方法(复合),并将树重写为第一种方法(单一)——但它非常复杂和冗长。但对EntityFramework非常有用(不支持Expression.Invoke)。您需要创建一个lambda-即varlambda=Expression.Lambda>(body,param);Func方法=lambda.Compile();intv=方法(1.0);//测试其中“body”是涉及ParameterExpression参数类型树的表达式(带有浮点数,返回一个int)。你也可以找到这个,这很有帮助。以上是C#学习教程:C#如何将表达式树编译成可调用的方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: