gpt4 book ai didi

c# - 我如何生成带有捕获变量的嵌套 lambda 表达式

转载 作者:行者123 更新时间:2023-11-30 19:35:35 31 4
gpt4 key购买 nike

我正在尝试生成类似 (Foo foo) => () => foo.Bar() 的表达式,然后运行提供 Foo 实例的外部 lambda , 因此返回值将是一个静态调用 Foo.Bar 的闭包,以避免动态调用引入的隐式异常捕获。

但是,调用外部表达式失败并出现异常“'ConsoleApp2.Foo' 类型的变量 '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");
}
}
}

最佳答案

您需要确保 lambda 表达式中的变量表达式引用相同的实例。

这段代码运行得很好,似乎给出了预期的结果。

void Main()
{
var var = Expression.Variable(typeof(Foo), "foo");

var expr = Expression.Lambda(
Expression.Lambda(
Expression.Call(var, typeof(Foo).GetMethod("Bar"))), new[] { var });

var res = (Action)expr.Compile().DynamicInvoke(new Foo());

res();
}

class Foo
{
public void Bar()
{
Console.WriteLine("Bar");
}
}

关于c# - 我如何生成带有捕获变量的嵌套 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54240685/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com