У меня была часть кода, которая принимает лямбда-выражения во время выполнения, которые затем я могу скомпилировать и вызвать.
Something thing;
Expression<Action<Something>> expression = (c => c.DoWork());
Delegate del = expression.Compile();
del.DynamicInvoke(thing);
Чтобы сэкономить время выполнения, я сохранил эти скомпилированные делегаты в кеше, Dictionary<String, Delegate>
, ключом которого является строка лямбда-выражения.
cache.Add("(Something)c => c.DoWork()", del);
Для точно таких же звонков все работало нормально. Однако я понял, что могу получать эквивалентные лямбды, такие как "d => d.DoWork ()", для которых мне действительно нужно использовать тот же делегат, а я не был.
Это заставило меня задуматься, есть ли чистый способ (читай "не используя String.Replace", я уже сделал это как временное исправление) для замены элементов в лямбда-выражении, например, возможно, заменив их на arg0
что оба
(c => c.DoWork())
и (d => d.DoWork())
преобразуются и сравниваются как (arg0 => arg0.DoWork())
с помощью чего-то похожего на введение параметра Expression.Parameter (Type, Name) в лямбду.
Это возможно? (Ответы могут включать C # 4.0)