c# - 如何从字符串创建 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 并将其作为参数传递;只是寻找更简单的东西,我只能使用变量的名称。)
解决方案
您真正想要的是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
推荐阅读
- python - 我的列表包含重复元素,我不知道为什么
- python - 如何同时使用 asyncio 模块调用 nameko 服务
- angular - 如何从 Angular 7 中的 api 获取请求
- python - 多索引切片(涉及时间序列/日期范围)不适用于 DataFrame,但适用于 Series
- reactjs - 未捕获的类型错误:无法读取未定义的属性“余额”
- javascript - 我可以在画布中完成css变换rotateY效果吗
- php - 使用以下代码获取数组的最小值
- c# - MassTrant - 消费者 DI 生命周期和注册选项
- python - 为什么在 elif 语句中出现语法错误?
- css - 需要 HTML 输入搞乱了我的输入