我有一個控件,它提供了一個選擇機制。但是,它選擇的項目不適合一般消費,而是必須投影到按日期參數化的不同類型中。這是不好的設計?
除此之外,還有一些控件需要封裝相同的信息,更重要的是,即使原始控件的選擇已更改,也希望保留特定選擇。因此,只有鏈接方法不起作用,因爲原始控件的方法將始終返回當前選擇的投影。
爲了解決這個問題,我創建了一個返回閉包的屬性,該閉包根據特定選擇執行投影。這樣,我可以封裝投影並保護正在投影的實際類型,但也封裝了特定的集合。這是我所擁有的簡化版本。
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;
所以,這是可怕的設計或巧妙地利用代表?
主要的原因我沒有做它的一個方法是,然後你會把它稱爲:control.CreateSelectionForDate()(DateTime.Today)。請注意雙括號。 – 2009-07-10 16:48:58
啊 - 好點。 – 2009-07-10 16:50:51