У меня есть элемент управления, и он обеспечивает механизм выбора. Однако элементы, которые он выбирает, не подходят для общего потребления и вместо этого должны проецироваться в другой тип, параметризованный по дате.
В дополнение к этому, есть некоторые элементы управления, которые хотят инкапсулировать ту же информацию и, что более важно, хотят сохранить определенный выбор, даже если выбор исходного элемента управления изменился. Поэтому просто методы цепочки не работают, потому что метод исходного элемента управления всегда будет возвращать проекцию его текущего выбора.
Чтобы обойти это, я создал свойство, которое возвращает замыкание, которое выполняет проекцию на основе определенного выбора. Таким образом, я могу инкапсулировать проекцию и защитить реальный проецируемый тип, а также инкапсулировать конкретную коллекцию. Вот упрощенная версия того, что у меня есть.
public class MySelectionControl
{
public Func<DateTime, IEnumerable<MyProjectedType>> CreateSelectionForDate
{
get
{
// Take a copy of the selection before creating the lambda so
// that the source items won't change if the selection does.
IEnumerable<MyRealType> copyOfSelection = this.realSelection.ToList();
return weekEnding =>
copyOfSelection.Select(x => new MyProjectedType(x, weekEnding));
}
}
}
Это можно затем вызвать как метод, как в:
MySelectionControl control = new MySelectionControl();
// Gives the current selection for a given date.
control.CreateSelectionForDate(DateTime.Today);
// Takes a copy of the selection for later use, regardless of
// whether the original selection changes.
var selectedItemsProjection = control.CreateSelectionForDate;
Итак, это ужасный замысел или умное использование делегатов?