提供以下课程:
public class Foo {
public string Bar {get; set;}
Func<string> GetFunc = () => Bar;
}
以下代码将显示True
:
var foo = new Foo();
var fn = foo.GetFunc;
Console.WriteLine(fn.Target == foo);
因为action
委托的目标是对象的实例。
如何保留代表实例返回的LambdaExpression
目标的表达式?
public class Foo1 {
public string Bar {get;set;}
Expression<Func<string>> GetExpression = () => Bar;
}
var foo = new Foo();
var expr = foo.GetExpression;
// ???
我认为编译expr
并检查生成的委托的Target
属性是可行的,并且确实返回Closure的实例,其中foo
是其中之一数组在Constants属性处引用的对象。
var closure = expr.Compile().Target as System.Runtime.CompilerServices.Closure;
Console.WriteLine(closure.Constants.Contains(foo));
// prints True
但是,这对我没有帮助,因为如果我使用System.Linq.Expressions.Expression处的工厂方法构造表达式,则:
// using static System.Linq.Expressions.Expression;
var foo = new Foo();
Expression<Func<string>> expr = Lambda<Func<string>>(
MakeMemberAccess(
Constant(foo),
typeof(Foo).GetMember("Bar").Single()
)
);
并获得编译表达式的目标,foo
也是Constants
之一。
我正在寻找由编译器生成的this
中LambdaExpression
所引用的一个或多个对象(如果与其他标识符没有冲突,则this
可以被淘汰)。
(可以找到here的某些背景。)