2

有没有办法在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 方法,它们只接受表达式文本和一个简单的对象值作为表达式上下文。

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

感谢伟大的图书馆,尼尔

4

1 回答 1

2

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

选项 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:使用 this/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 库的作者。

于 2014-04-26T07:39:41.837 回答