Linq Expression快照索引值

时间:2014-08-20 12:38:08

标签: c# linq lambda expression

使用代码最简单地描述了这个问题:

class Program
{
    static void Main(string[] args)
    {
        int index = 0;
        var listOfExpressions = new List<ClassHoldingExpression>();
        listOfExpressions.Add(new ClassHoldingExpression((a) => a.Dict[index]));

        index++;
        listOfExpressions.Add(new ClassHoldingExpression((a) => a.Dict[index]));

        var dictClass = new ClassWithDict();
        dictClass.Dict[0] = "Test 1";
        dictClass.Dict[1] = "Test 2";

        foreach (var expr in listOfExpressions)
            Console.WriteLine((string)expr.Eval(dictClass));
    }
}


public class ClassWithDict
{
    public ClassWithDict()
    {
        Dict = new Dictionary<int, object>();
    }
    public Dictionary<int, object> Dict { get; set; }
}
public class ClassHoldingExpression
{
    private Expression<Func<ClassWithDict, object>> Expression { get; set; }

    public ClassHoldingExpression(Expression<Func<ClassWithDict, object>> expr)
    {
        Expression = expr;
    }

    public object Eval(ClassWithDict source)
    {
        return this.Expression.Compile().Invoke(source);
    }
}

//Output: 
//Test 2
//Test 2

//Desired:
//Test 1
//Test 2

基本上,我想用多个值填充该字典,并在特定的indeces中填充具有不同表达式的ClassHoldingExpression列表。但是,它似乎回顾并查找“index”的当前值,而不是将当前值保存到表达式中。如何强制它将index的当前保存到表达式中?

2 个答案:

答案 0 :(得分:1)

您必须创建一个新变量来保存您想要的值。

int index0 = 0;
var listOfExpressions = new List<ClassHoldingExpression>();
listOfExpressions.Add(new ClassHoldingExpression((a) => a.Dict[index0]));

int index1 = index0 + 1;
listOfExpressions.Add(new ClassHoldingExpression((a) => a.Dict[index1]));

如果需要在循环中执行此操作,请在捕获之前为每个循环迭代定义一个变量。

答案 1 :(得分:-1)

看起来像是一个封闭问题。

foreach (var TMPexpr in listOfExpressions){
   var expr = TMPexpr ;  // take LOCAL copy
   Console.WriteLine((string)expr.Eval(dictClass));
}

similar SO post