首页 > 解决方案 > 如何从字符串创建 LambdaExpression?

问题描述

我想写一个方法,它接受一个字符串参数——比如说sLastName——并返回一个非常简单的方法Func<string>,它已经捕获了该变量并简单地返回它。这行不通...

Func<string> MyMethod (string myStringVar)
{
    return () => myStringVar;
}

...如果sLastName"Smith",我打电话MyMethod(sLastName).Invoke(),我会回来"Smith";但如果我再设置sLastName并再次"Jones"调用MyMethod,我仍然会回来"Smith"

因此,为了使使用MyMethod尽可能简单,我希望能够sLastName作为字符串传入,然后(假设sLastName已被声明,在范围内等),通过某种方式利用Expression类,返回Func<string>带有sLastName嵌入的作为一个捕获的变量......就像这样......

MyMethod("sLastName").Invoke()

...它会返回. sLastName但是我看不到任何使用字符串构建表达式的方法,并且在 StackOverflow 中还没有找到这种方法。有什么办法可以做到这一点?

提前致谢!(顺便说一句,我知道我可以即时创建 lambda 并将作为参数传递;只是寻找更简单的东西,我只能使用变量的名称。)

标签: c#lambda

解决方案


您真正想要的是myStringVar将其声明为ref变量,MyMethod以便通过引用而不是按值传递(这将复制值,这就是您看不到更新值的原因)。这样 lamda 有一个引用,myStringVar因此无论何时调用都会返回最新的值。但是,不允许在 lambda 函数中引用 ref 变量

在您的代码中,您按值传递:

Func<string> MyMethod (string myStringVar)
{
    return () => myStringVar; // When MyMethod is called, the value of myStringVar inside this function and thus the lambda is a copy of what was passed in
}

这将是相似的,但在不知道您要完成什么的情况下,我不确定它是否适用于您的场景:

public static void Main()
{
    var myStringVar = "Smith";
            
    Func<string> returnMyString = () => MyMethod(ref myStringVar);
        
    Console.WriteLine(returnMyString());
    
    myStringVar = "Jones";
    Console.WriteLine(returnMyString());
}

public static string MyMethod(ref string myStringVar)
{
    return myStringVar; // myStringVar holds a reference to the one from the Main program and so returns the latest value
}

输出是:史密斯琼斯

这是一个带有示例的.net fiddle


推荐阅读