给定以下代码:
int min = 0;
Expression<Func<List<IUser>, bool>> ulContainsJohn =
(l => l.Where(u => u.FirstName == "John").Count() > min);
Assert.AreEqual(true, ulContainsJohn.Compile()(userList));
min = 3;
Assert.AreEqual(true, ulContainsJohn.Compile()(userList));该列表包含1个"John",但第二个断言失败。我如何将min的值绑定到Func,这样它就不会尝试重新计算变量min?
澄清:我不想更改签名。我希望表达式树将min计算为常量表达式,而不是变量。有没有办法转换min的求值,使树有一个常量表达式而不是变量求值?
发布于 2010-08-06 22:51:52
编辑:阅读您的评论,尝试使用函数创建器。
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));发布于 2010-08-06 22:18:52
您必须将其设置为参数。
Expression<Func<List<IUser>, int, bool>> ulContainsJohn =
(List<IUser> l, int min) => (l.Where(u => u.FirstName == "John").Count() > min);
ulContainsJohn.Compile()(userList, min);发布于 2010-08-06 22:18:50
最简单的解决方案是创建一个单独的变量:
int min = 0;
int staticMin = min;
Func<List<IUser>, bool> ulContainsJohn =
l => l.Where(u => u.FirstName == "John").Count() > staticMin ;https://stackoverflow.com/questions/3424622
复制相似问题