【问题标题】:Dynamic parameter in parsed expression解析表达式中的动态参数
【发布时间】:2018-06-29 18:55:44
【问题描述】:

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

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


    【解决方案1】:

    可以直接使用Parse方法返回的Lambda类,不调用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 动态。

    【讨论】:

    • 感谢您的快速响应!由于性能要求,我更喜欢编译表达式。所有这一切背后的想法是 json 转换 - JUST 库在繁重的负载下让我非常失望(并且在转换规则旁边有糟糕的语法)。无论如何,我会尝试 Lambda 并尽快提供反馈。
    • @ProfyTroll 在内部始终编译表达式,不同之处在于在这种情况下我编译为委托。但性能应该相似。前段时间我做过类似的实验:github.com/deltatre-webplu/DynamicExpresso.Template
    • 感谢您,我设法编译表达式并在内部动态使用 JToken。关于 Delegate vs Func - 在内部,我看到它是 Delegate.DynamicInvoke,无论如何它应该比编译的仿函数慢。虽然我必须承认我没有进行任何测量并且不确定它有多慢,但它可能相对较小。
    • UPD:好像有人做过实验 stackoverflow.com/questions/12858340/… 我必须说差别很大
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 2021-07-16
    • 2013-08-20
    相关资源
    最近更新 更多