没有内置解决方案,但您可以通过多种方式对其进行模拟:
选项 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
(或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 库的作者。