我有以下代码:
string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));
因为编译器用闭包替换了前缀变量,所以“NEW:brownie”被打印到控制台。
有没有一种简单的方法可以防止编译器在仍然使用 lambda 表达式的同时提升前缀变量?我想要一种使我的 Func 工作方式与以下内容相同的方法:
Func<string, string> prependAction = (x => "OLD:" + x);
我需要这个的原因是我想序列化生成的委托。如果前缀变量在不可序列化的类中,则上述函数将不会序列化。
目前我能看到的唯一解决方法是创建一个新的可序列化类,将字符串存储为成员变量并具有字符串前置方法:
string prefix = "NEW:";
var prepender = new Prepender {Prefix = prefix};
Func<string, string> prependAction = prepender.Prepend;
prefix = "OLD:";
Console.WriteLine(prependAction("brownie"));
使用助手类:
[Serializable]
public class Prepender
{
public string Prefix { get; set; }
public string Prepend(string str)
{
return Prefix + str;
}
}
这似乎需要做很多额外的工作才能让编译器变得“愚蠢”。