lambda 表达式“规则”是 c# 编译器(或您使用的任何语言)的一部分;表达式本身没有上下文的自动知识。相反,如果您“捕获”一个变量,即x
如下:
int x = ...
Expression<Func<Foo, bool>> predicate = obj => obj.Bar == x;
编译器创建一个生成的上下文类的实例,并使用ConstantExpression
它与树相关联:
// approximate representative code; not literal translation
var ctx = new SomeContext();
ctx.x = ... // x is actually a public instance field of SomeContext
var param = Expression.Parameter(typeof(Foo), "obj");
var predicate = Expression.Lambda<Func<Foo, bool>>(
Expression.Equal(
Expression.PropertyOrField(param, "Bar"),
Expression.PropertyOrField(Expression.Constant(ctx), "x")
), param);
“交换”上下文实例的唯一方法是重写整个表达式,通常通过ExpressionVisitor
. 另请注意,嵌套范围可能导致涉及链接上下文对象的更复杂场景。
亲自; 我怀疑你需要担心这个。