我目前正在开展一个工作项目,我们正在使用Telerik RadControls for Silverlight。在2011年第一季度的发布中,他们添加了一个名为Rad Expression Editor的新控件。在Rad Expression Editor中,您可以传入一个对象并创建公式(或表达式),编辑器窗口将为您提供表达式结果的预览。我已经与Telerik讨论了这个问题,他们故意没有公开这个结果,但提到我可以使用LambdaExpression.Compile()。我对Linq很新,并且一般使用Lambda Expressions,但是开始研究它。
举个例子,假设我有一个名为Finances的对象,在该对象中,有4个可空的十进制字段(值):借记(10),借记YTD(100),信用(20)和CreditYTD(200) 。在公式中,我想做的事情如下:借方 - 贷方+借方YTD - CreditYTD。
Telerik Rad Expression Editor将为我提供生成的表达式:
ExpressionEditor.Expression = {Param_0 => ((Param_0.Debit - Param_0.Credit + Param_0.DebitYTD - Param_0.CreditYTD}
此表达式的结果应为-110。我需要能够获得在表达式中计算的值,但是无法弄清楚如何获得这个数字。任何人都可以解释如何实现这一目标?感谢。
答案 0 :(得分:2)
你还没有真正告诉我们它所暴露的API,但它听起来就像你可以使用的那样:
var compiled = ExpressionEditor.Expression.Compile();
var result = compiled(input);
其中input
是Finances
类型的适当变量。
编辑:好的,因为表达没有很好地曝光:
var typeSafe = (Expression<Func<Finance, decimal?>>) ExpressionEditor.Expression;
var compiled = typeSafe.Compile();
var result = compiled(input);
答案 1 :(得分:0)
我有非常相似的要求。需要编译表达式并在运行时针对不同的实例进行评估。但是,函数编译并不是那么简单,因为您必须在编译期间知道结果值的类型,并且在大多数情况下这是不可能的:用户写入“1 + 1”并且您获得System.Int32,或者用户写入“ (1 + 1).ToString()“你得到System.String。我确信这是您遇到(或将遇到)困难的重点。
为了解决表达式编译问题,我建议跳转到DLR(动态语言运行时)。您需要为Silverlight项目引用“Microsoft.CSharp”程序集。因为你只需要访问表达式的“编译”方法(已经在那里),对于“动态”对象来说就足够了。这是一个简短的样本来证明:
dynamic dynamicExpression = expressionEditor.Expression;
dynamic compiledExpression = dynamicExpression.Compile();
object executionResult = compiledExpression(myInstance);
“executionResult”变量将保存表达式求值的结果。现在,你可以做任何你需要做的事情。
希望有所帮助