动态表达foreach与lambda?

时间:2013-07-09 05:24:48

标签: c# dynamic-expresso

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

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))
{
 ...
}

1 个答案:

答案 0 :(得分:2)

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

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

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)。然后,您可以从表达式中调用此帮助程序。