2009-07-10 110 views
0

我有一個控件,它提供了一個選擇機制。但是,它選擇的項目不適合一般消費,而是必須投影到按日期參數化的不同類型中。這是不好的設計?

除此之外,還有一些控件需要封裝相同的信息,更重要的是,即使原始控件的選擇已更改,也希望保留特定選擇。因此,只有鏈接方法不起作用,因爲原始控件的方法將始終返回當前選擇的投影。

爲了解決這個問題,我創建了一個返回閉包的屬性,該閉包根據特定選擇執行投影。這樣,我可以封裝投影並保護正在投影的實際類型,但也封裝了特定的集合。這是我所擁有的簡化版本。

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; 

所以,這是可怕的設計或巧妙地利用代表?

回答

2

由於這種安排的目的是提供一個框架,並且從該環境中運行的方法,它似乎更好更是這樣使用它:

Closure closure = selectionControl.GetClosure(DateTime.Today); 
closure.DateSelection ... 
1

我覺得這很聰明。我會做的唯一的事情就是把你的財產(CreateSelectionForDate)變成一種方法,因爲(對我來說)會使代碼更清晰。

+0

主要的原因我沒有做它的一個方法是,然後你會把它稱爲:control.CreateSelectionForDate()(DateTime.Today)。請注意雙括號。 – 2009-07-10 16:48:58

+0

啊 - 好點。 – 2009-07-10 16:50:51