C# 带lambda的Dynamic expresso foreach?

C# 带lambda的Dynamic expresso foreach?,c#,dynamic-expresso,C#,Dynamic Expresso,我正在使用DynamicExpresso库。 我想计算包含foreach语句的表达式。 可能吗? 我能看到的唯一方法是编写参数化方法,并将整个类作为参数发送给解释器 var target = new Interpreter(); target.SetVariable("a", a, typeof(Tools)); target.SetVariable("b", b, typeof(List<param>)); if (target.Eval("a.MethodWithForeach(

我正在使用DynamicExpresso库。 我想计算包含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))
{
 ...
}
var target=new解释器();
SetVariable(“a”,a,typeof(Tools));
SetVariable(“b”,b,typeof(List));
if(target.Eval(“a.MethodWithForeach(b)”).Equals(true))
{
...
}

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

现在,作为一种解决方法,您可以编写以下帮助程序:

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);
        }
    }
}
使用系统;
使用Microsoft.VisualStudio.TestTools.UnitTesting;
使用System.Linq;
使用System.Linq.Expressions;
使用System.Collections.Generic;
命名空间DynamicXpresso.UnitTest
{
[测试类]
公共类集合帮助测试
{
[测试方法]
公共无效,其中()
{
var target=new解释器();
SetVariable(“IntCollectionHelper”,new CollectionHelper());
var list=新列表{1,10,19,21};
var results=target.Eval(“IntCollectionHelper.Where(list,\“x>19\”),新参数(“list”,list))
如同数不清的;
Assert.AreEqual(1,results.Count());
aresequal(21,results.First());
}
}
公共类CollectionHelper
{
只读解释器\u解释器;
公共集合助手()
{
_解释器=新解释器();
}
公共IEnumerable,其中(IEnumerable值,字符串表达式)
{
var谓词=_解释器.Parse(表达式,“x”);
返回值。其中(谓词);
}
}
}

基本上,我创建了一个小助手来模拟一些LINQ函数(
Where
,在上面的示例中)。然后,您可以通过表达式调用此帮助程序。

Davide,是否有可能在Dynamic Expresso中获得更实质性的lambda支持?@Igorek我在github上创建了一个问题:。我将在接下来的几周内努力解决这个问题。