2011-02-27 61 views
3

我有幾個控制,所有從UserControl繼承,而我有上UserControl類型(救我從編寫出6點不同的方法)運行的MergeSort方法,但是當我投回到我排序後的自定義控件,它會拋出一個錯誤,我做錯了什麼? mergesort方法需要每個自定義控件使用的Left屬性,那麼是否有其他方式可以執行此操作?無效轉換到自定義控件

歸併方法是這樣的:

public UserControl[] MergeSort(UserControl[] array) 

演員的樣子:(我刪除了我以前的答案,因爲我認爲這實際上是不正確的)

(CustomControl[])MergeSort(customControlArray); 

回答

2

我認爲你必須手動施放它們:

CustomControl[] customControlArray; 
... 
UserControl[] sortedControls = MergeSort(customControlArray); 
CustomControl[] sortedCustomControls = Array.ConvertAll<UserControl, CustomControl>(sortedControls, delegate(UserControl control) 
{ 
    return (CustomControl)control; 
}); 

如果您在您的處置有.NET 3.5+,你可以使用更「冷」的語法。 :)

編輯:冷卻器語法是:

UserControl[] sortedControls = customControlArray.ToList().ConvertAll(c => (CustomControl)c).ToArray(); 

:-)

+0

這工作,結合使用基類而不是usercontrol – 2011-02-27 16:23:25

+0

順便說一句,你是什麼意思'冷卻器'語法? – 2011-02-27 16:28:36

+0

Cheers @Chi請參閱我編輯的使用.NET 3.5新功能的語法。 :) – 2011-02-28 09:23:02

2

這聽起來像你需要在控件和代表通用功能的UserControl之間進行抽象。有做到這一點主要有兩種方式,和哪一個您使用的是個人的喜好編碼的問題,你打算如何進一步擴大了這些,你如何組織你的代碼的項目,等...

  1. 繼承來自基類。基本上,創建一個MyCustomControl(或任何你想命名它的類),它實現你的自定義控件之間的通用功能。這將從UserControl繼承,您的控件將從此繼承。然後你的方法會期望/返回這個基類的一個數組。
  2. 實現一個接口。你可以創建一個ICustomControl(或任何你想命名它的)接口,它代表你的自定義控件之間的通用功能。然後,您的控件將繼承UserControl以及執行ICustomControl。然後你的方法會期望/返回這個接口類型的數組。

我個人比較喜歡接口方法。在許多人的面向對象代碼中,繼承往往被濫用,實際上不應該這樣做。一個接口更好地將抽象(或代碼契約)表示爲類型(而不是類)。但是,這是另一次的更大的討論辯論,我想:)

+0

感謝的是,大衛,我會努力的接口方法 – 2011-02-27 15:33:43

+0

我都嘗試,他們還是給了同樣的錯誤 – 2011-02-27 16:20:16