У меня есть следующий код:
string prefix = "OLD:";
Func<string, string> prependAction = (x => prefix + x);
prefix = "NEW:";
Console.WriteLine(prependAction("brownie"));
Поскольку компилятор заменяет переменную префикса закрытием, «NEW: brownie» выводится на консоль.
Есть ли простой способ запретить компилятору поднимать префиксную переменную, все еще используя лямбда-выражение? Я хотел бы, чтобы мой Func работал так же:
Func<string, string> prependAction = (x => "OLD:" + x);
Причина, по которой мне это нужно, в том, что я хотел бы сериализовать полученный делегат. Если префиксная переменная относится к не сериализуемому классу, вышеуказанная функция не будет сериализована.
Единственный способ обойти это, я вижу на данный момент, - создать новый сериализуемый класс, который хранит строку как переменную-член и имеет метод prepend строки:
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;
}
}
Это кажется большой работой, чтобы компилятор был "тупым".