已解析表达式中的动态参数
Dynamic parameter in parsed expression
了解我的情况的快速示例:
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 方法,然后得到一个接受这些参数的仿函数?
可以直接使用Parse
方法返回的Lambda
class,不调用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 动态。
了解我的情况的快速示例:
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 方法,然后得到一个接受这些参数的仿函数?
可以直接使用Parse
方法返回的Lambda
class,不调用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 动态。