Я пытаюсь сгенерировать выражение типа (Foo foo) => () => foo.Bar()
, а затем запустить внешнюю лямбду, предоставив экземпляр Foo
, чтобы возвращаемое значение было замыканием, которое статически вызывает Foo.Bar
, чтобы избежать неявного перехвата исключений, введенного динамический вызов.
Однако вызов внешнего выражения завершается неудачно с исключением «переменная 'foo' типа 'ConsoleApp2.Foo', на которую ссылается область действия '', но она не определена".
Я совершаю какую-то ошибку или есть какая-то концептуальная причина, предотвращающая ее?
Минимальный полный код:
using System;
using System.Linq.Expressions;
namespace ConsoleApp2 {
class Program {
static void Main(string[] args)
{
// supposed to be "(Foo foo) => () => foo.Bar()",
// inspecting `expr` in debugger seems to agree
var expr = Expression.Lambda(
Expression.Lambda(
Expression.Call(Expression.Variable(typeof(Foo), "foo"), typeof(Foo).GetMethod("Bar"))),
new[] { Expression.Variable(typeof(Foo), "foo") });
// here exception "variable 'foo' of type 'ConsoleApp2.Foo' referenced from scope '', but it is not defined" is thrown
var res = (Action)expr.Compile().DynamicInvoke(new Foo());
res();
}
}
class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}
}