Учитывая следующий класс:
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
).
(Здесь можно найти .)