首页 > 解决方案 > 解析表达式中的动态参数

问题描述

了解我的情况的快速示例:

static Interpreter ParseInterpreter = new Interpreter();
...
var func = ParseInterpreter.Parse("ctx.SomeProp", new Parameter("ctx", typeof(???1)).Compile<Func<???2, object>>;
...
var token = JToken.Parse(s);
dynamic dToken = token;
var obj = func(dToken);

换句话说,有没有办法将一些动态参数传递给 Parse 方法,然后得到一个接受这些参数的函子?

标签: dynamic-expresso

解决方案


可以直接使用方法Lambda返回的类Parse,不调用Compile函数:

var interpreter = new Interpreter()
string expression = "ctx.SomeProp";
Lambda parsedExpression = interpreter.Parse(expression, new Parameter("ctx", typeof(object)));
var token = JToken.Parse(s);
var result = parsedExpression.Invoke(token);

我没有完全测试你的代码,但例如我有一个这样的测试可以正常工作:

dynamic dyn = new ExpandoObject();
dyn.Foo = "bar";
var interpreter = new Interpreter()
    .SetVariable("dyn", (object)dyn);
Assert.AreEqual(dyn.Foo, interpreter.Eval("dyn.Foo"));

考虑到这仅适用于 .NET 4.x,不支持 .NET Standard/Core 动态。


推荐阅读