能够设置表达式的上下文

时间:2014-04-25 22:45:25

标签: dynamic-expresso

有没有办法在Dynamic Expresso library中设置表达式的上下文,以便我们可以执行以下操作:

interpreter.Eval("FirstName", new Parameter("person", new { FirstName="Homer", LastName="Simpson"}));

而不是

interpreter.Eval("person.FirstName", new Parameter("person", new { FirstName="Homer", LastName="Simpson"}));

也许我们可以有另一种选择,即第一个参数将被用作表达式的上下文。

我想也可能有另一个版本的Parse和Eval方法,它们只需要表达式文本和一个简单的对象值作为表达式上下文。

除此之外,缺乏对动态类型的支持,我真的很喜欢这个库。我曾经做过类似的事情,但没有添加对扩展方法和泛型方法调用的支持。

感谢伟大的图书馆, 尼尔

1 个答案:

答案 0 :(得分:1)

没有内置解决方案,但您可以通过多种方式对其进行模拟:

选项1:注入表达式

var workingContext = new { FirstName = "homer" };

var workingContextExpression = Expression.Constant(workingContext);
var firstNameExpression = Expression.Property(workingContextExpression, "FirstName");

var interpreter = new Interpreter();
interpreter.SetExpression("FirstName", firstNameExpression);

Assert.AreEqual(workingContext.FirstName, interpreter.Eval("FirstName"));

基本上我使用SetExpression方法注入表达式。注入的表达式是您希望可用的属性。

选项2:使用此/ me / it变量

您可以注入一个包含工作对象的变量。我通常将其称为this(或meit,具体取决于应用程序。)

var workingContext = new { FirstName = "homer" };

var interpreter = new Interpreter();
interpreter.SetVariable("this", workingContext);

Assert.AreEqual(workingContext.FirstName, interpreter.Eval("this.FirstName"));

选项3:以前解决方案的组合

var workingContext = new { FirstName = "homer" };

var interpreter = new Interpreter();
interpreter.SetVariable("this", workingContext);
var firstNameExpression = interpreter.Parse("this.FirstName").LambdaExpression.Body;
interpreter.SetExpression("FirstName", firstNameExpression);

Assert.AreEqual(workingContext.FirstName, interpreter.Eval("FirstName"));

等于第一个解决方案,但我使用解析器本身生成表达式。

考虑所有解决方案都假设您必须为每个上下文设置一个Interpreter实例。

免责声明:我是Dynamic Expresso库的作者。