与LambdaExpression的Delegate.Target等效

时间:2019-02-17 22:25:46

标签: c# .net expression-trees

提供以下课程:

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之一。

我正在寻找由编译器生成的thisLambdaExpression所引用的一个或多个对象(如果与其他标识符没有冲突,则this可以被淘汰)。

(可以找到here的某些背景。)

0 个答案:

没有答案