Вам необходимо сохранить акт установки чего-либо в строку , поэтому сохраните Action<string>
:
public class CustomControl {
public Action<string> SetData { get; set; }
public void Update() {
// TODO nullity check
SetData("test");
}
}
Тогда Consume
будет выглядеть так:
public class Consume {
public void Example() {
CustomControl ctrl = new CustomControl();
// store {the act of setting this property of this object to a string}
ctrl.SetData = s => anyObject.anyProperty = s;
ctrl.Update();
}
}
Вызов Update
установит anyObject.anyProperty
в test
. Обратите внимание, что вы храните конкретный акт установки этого свойства конкретного anyObject
, на который вы ссылаетесь в присваивании SetData
.
Чтобы расширить лямбду: мы хотим создать значение типа Action<string>
, то есть вещь , которая принимает string
и не возвращает результата . Такой вещью будет исполняемый код . До C # 3, чтобы создать «значение», которое было исполняемым кодом, нам пришлось бы сделать что-то вроде:
ctrl.SetData = delegate(string s) { someObject.SomeProperty = s; };
С этим синтаксисом становится более очевидным, что мы создаем метод - у него тело с разделителями { }
, в нем есть операторы, и ясно, что есть строковый параметр, который используется тело.
Одна вещь, которая достигается с помощью лямбда-выражений в C # 3, - это возможность сжать это; слабо, всего
// not compilable code
delegate(parameters) { body; }
можно заменить на
// not compilable code
(parameters) => body;
и в случае, когда есть только один параметр
// not compilable code
parameter => body;
что и есть: выражение, присвоенное ctrl.SetData
, представляет собой фрагмент поведения , которое принимает строку (s
) и устанавливает anyObject.anyProperty
для этой строки. Настоящая сила в том, что компилятор C # может определять типы, которые он знает, что мы создаем Action<string>
.