编辑:阅读你的评论,尝试函数的创造者。
Func<int, Func<List<IUser>, bool>> createFn = (min) =>
(l) => (l.Count(u => u.FirstName == "John") > min);
Func<List<IUser>, bool>> contains0 = createFn(0);
Assert.AreEqual(true, contains0(userList));
Func<List<IUser>, bool>> contains3 = createFn(3);
Assert.AreEqual(true, contains3(userList));
尝试使用1元素数组。丑,但它的作品。
var values = new int[] { 0 };
Expression<Func<List<IUser>, bool>> ulContainsJohn =
(l => l.Where(u => u.FirstName == "John").Count() > values[0]);
Assert.AreEqual(true, ulContainsJohn.Compile()(userList));
values[0] = 3;
Assert.AreEqual(true, ulContainsJohn.Compile()(userList));
另一种选择,更好:
private int Minimum { get; set; }
...
Expression<Func<List<IUser>, bool>> ulContainsJohn =
(l => l.Where(u => u.FirstName == "John").Count() > Minimum);
Func<List<IUser>, bool> fn = ulContainsJohn.Compile();
Assert.AreEqual(true, fn(userList));
Minimum = 3;
Assert.AreEqual(true, fn(userList));
为什么?你想解析表达式树吗? – SLaks 2010-08-06 14:34:15
你有一个悖论......你想要一个不断的表达......但你的测试正在改变它? – Nix 2010-08-06 14:56:47
我希望函数ulContainsJohn中min bound的值作为一个常量表达式。 min可以改变,函数内的值不应该改变。现在有道理吗? – Shlomo 2010-08-06 15:49:27