有没有办法在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方法,它们只需要表达式文本和一个简单的对象值作为表达式上下文。
除此之外,缺乏对动态类型的支持,我真的很喜欢这个库。我曾经做过类似的事情,但没有添加对扩展方法和泛型方法调用的支持。
感谢伟大的图书馆, 尼尔
答案 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
(或me
或it
,具体取决于应用程序。)
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库的作者。