Search code examples
dynamic-expresso

Dynamic parameter in parsed expression


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?


Solution

  • 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.