【问题标题】:Dynamic expresso foreach with lambda?带有 lambda 的动态 expresso foreach?
【发布时间】:2013-07-09 05:24:47
【问题描述】:

我正在使用 Dynamic-Expresso 库。 我想评估包含 foreach 语句的表达式。 那可能吗? 我能看到的唯一方法是编写参数化方法并将整个类作为参数发送给解释器

var target = new Interpreter();
target.SetVariable("a", a, typeof(Tools));
target.SetVariable("b", b, typeof(List<param>));
if (target.Eval("a.MethodWithForeach(b)").Equals(true))
{
 ...
}

【问题讨论】:

    标签: c# dynamic-expresso


    【解决方案1】:

    您是对的,目前还没有一种简单的方法来处理集合。 我已经计划开发此功能,但我不知道确切的发布日期。

    目前,作为一种解决方法,您可以编写一些帮助程序,如下所示:

    using System;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using System.Linq;
    using System.Linq.Expressions;
    using System.Collections.Generic;
    
    namespace DynamicExpresso.UnitTest
    {
        [TestClass]
        public class CollectionHelperTests
        {
            [TestMethod]
            public void Where()
            {
                var target = new Interpreter();
    
                target.SetVariable("IntCollectionHelper", new CollectionHelper<int>());
    
                var list = new List<int> { 1, 10, 19, 21 };
    
                var results = target.Eval("IntCollectionHelper.Where(list, \"x > 19\")", new Parameter("list", list))
                                        as IEnumerable<int>;
    
                Assert.AreEqual(1, results.Count());
                Assert.AreEqual(21, results.First());
            }
        }
    
        public class CollectionHelper<T>
        {
            readonly Interpreter _interpreter;
    
            public CollectionHelper()
            {
                _interpreter = new Interpreter();
            }
    
            public IEnumerable<T> Where(IEnumerable<T> values, string expression)
            {
                var predicate = _interpreter.Parse<Func<T, bool>>(expression, "x");
    
                return values.Where(predicate);
            }
        }
    }
    

    基本上我已经创建了一个小助手来模拟一些 LINQ 函数(在上面的例子中是Where)。然后你可以从你的表达式中调用这个助手。

    【讨论】:

    【解决方案2】:

    version 2.9.0开始,Dynamic Expresso 支持 lambda 表达式!

    注意:默认情况下禁用 lambda 表达式解析,因为它对性能有轻微影响。它必须通过InterpreterOptions.LambdaExpressions 标志启用:

    var options = InterpreterOptions.Default | InterpreterOptions.LambdaExpressions;
    var interpreter = new Interpreter(options);
    

    现在可以这样写了:

    var options = InterpreterOptions.Default | InterpreterOptions.LambdaExpressions;
    var interpreter = new Interpreter(options);
    
    var list = new List<string> { "this", "is", "awesome" };
    interpreter.SetVariable("myList", list);
    
    var expr = "myList.Where(str => str.Length > 5).Select(str => str.ToUpper())";
    var results = interpreter.Eval<IEnumerable<string>>(expr);
    
    Assert.AreEqual(new[] { "AWESOME" }, results);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-14
      • 2018-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      相关资源
      最近更新 更多