Относительно легко создать лямбда-функцию, которая будет возвращать значение свойства из объекта, даже включая глубокие свойства ...
Func<Category, string> getCategoryName = new Func<Category, string>(c => c.Name);
и это можно назвать следующим образом ...
string categoryName = getCategoryName(this.category);
Но, учитывая только результирующую функцию выше (или выражение, изначально использовавшееся для создания функции), любой может предоставить простой способ создания противоположного действия ...
Action<Category, string> setCategoryName = new Action<Category, string>((c, s) => c.Name = s);
... что позволит установить такое же значение свойства следующим образом?
setCategoryName(this.category, "");
Обратите внимание, что я ищу способ программно создать действие из функции или выражения - надеюсь, я показал, что уже знаю, как создать его вручную.
Я открыт для ответов, которые работают как в .net 3.5 и 4.0.
Спасибо.
UPDATE:
Возможно, я не совсем ясен в своем вопросе, поэтому позвольте мне попытаться продемонстрировать более четко, что я пытаюсь сделать.
У меня есть следующий метод (который я создал для целей этого вопроса) ...
void DoLambdaStuff<TObject, TValue>(TObject obj, Expression<Func<TObject, TValue>> expression) {
Func<TObject, TValue> getValue = expression.Compile();
TValue stuff = getValue(obj);
Expression<Action<TObject, TValue>> assignmentExpression = (o, v) => Expression<TObject>.Assign(expression, Expression.Constant(v, typeof(TValue)));
Action<TObject, TValue> setValue = assignmentExpression.Compile();
setValue(obj, stuff);
}
Что я ищу, так это как мне создать "assignmentExpression" в коде, чтобы я мог скомпилировать его в setValue? Я полагаю, что это связано с Expression.Assign, но я просто не могу определить правильную комбинацию параметров для завершения кода.
В конечном итоге можно позвонить
Category category = *<get object from somewhere>*;
this.DoLambdaStuff(category, c => c.Name);
и это, в свою очередь, создаст геттер и сеттер для свойства "Name" объекта Category.
Версия выше компилируется, но когда я вызываю setValue (), это приводит к ArgumentException с «Выражение должно быть доступно для записи».
Еще раз спасибо.