2010-06-02 65 views
-1

需要幫助我有一個函數在C#代碼

protected void bindCurrencies(DropDownList drp) 
    { 
     drp.DataSource = dtCurrencies; 
     drp.DataTextField = "CurrencyName"; 
     drp.DataValueField = "CurrencyID"; 
     drp.DataBind(); 
     drp.Items.Insert(0, new ListItem("Please Select")); 
    } 

我結合使用這個下拉列表。但有時我需要綁定一個ListBox。我不想爲列表框寫一個不同的函數。我應該如何做到這一點。我想在這裏使用泛型方法。但我對泛型沒有任何想法。

回答

9

無論DropDownListListControlListBox繼承,因此,如果你改變你的函數取ListControl爲參數,它應該有兩種類型的工作得很好:

protected void bindCurrencies(ListControl drp) 
{ 
    drp.DataSource = dtCurrencies; 
    // and so on... 
1

要求一個ListControl代替。 ListBox和DropDownList都繼承它,所以你可以使用它來包含兩者。

如果您需要某種的類,則使用泛型(大多數情況下)。例如,字符串列表可以是泛型中的List。

-2

傳遞參數爲對象,則簡單地使用對象:

.Getype() 

圍繞一個SELECT語句,並把它轉換爲該類型。

與傳遞ListControl的其他解決方案不同,這將允許您傳遞其他控件類型(並根據需要擴展邏輯)。

EDIT 1(響應塞巴斯蒂安):

private void bindCurrencies(object PControl) 
{ 
    switch (PControl.GetType.ToString) { 
     case "Windows.Forms.ListBox": 
      Windows.Forms.ListBox ctrl = (Windows.Forms.ListBox)PControl; 
      break; 
     //Do Logic' 
     case "Windows.Forms.DropDownList": 
      break; 
      //etc 
      //etc 
    } 
    } 

永遠記住: KISS(保持簡單愚蠢)

+0

這將使得代碼更復雜,不是簡單的和愚蠢的。如果他稍後需要將其擴展爲另一種對象類型,那麼他應該創建一個匹配的超載。這避免了不必要的轉換,並且是類型之間的更加明確的區別,並且不需要更改(並可能中斷)工作代碼來擴展它。 – 2010-06-02 10:22:32

+0

我不同意,我寧願維護圍繞對象類型有一個簡單的選擇案例的代碼。添加/刪除操作非常簡單,只需編輯選擇邏輯(不是很困難)。而不是有多個重載的函數/方法遍佈整個地方,在我看來這是不太可維護的。使用簡單的選擇案例不會破壞現有代碼,而不會超過重載版本。 – Darknight 2010-06-02 10:32:48

+0

請閱讀Robert Martin的「Clean Code」。他非常好地描述了爲什麼select/switch語句不適合維護代碼,應該避免。 – 2010-06-02 10:47:33