Dynamic parameter in parsed expression

356 Views Asked by At

A quick sample to understand my situation:

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);

In other words, is there a way to pass some dynamic parameter to Parse method and then get a functor which accepts such parameters?

1

There are 1 best solutions below

4
On BEST ANSWER

You can directly use the Lambda class returned by the Parse method, and not call the Compile function:

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);

I have not tested exactly your code but for example I have a test like this that works correctly:

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

Consider that this only works on .NET 4.x, on .NET Standard/Core dynamics are not supported.