Эквивалент Delegate.Target для LambdaExpression - PullRequest
0 голосов
/ 18 февраля 2019

Учитывая следующий класс:

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 - один из объектов, на которые ссылается массив в константах property.

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 (и если нет конфликтов с oДля идентификаторов можно указать this).

(Здесь можно найти .)

...