2008-11-11 122 views
0

我有一個頁面,我必須根據用戶選擇動態加載控件。 比方說,我有這樣的事情:需要重構解決方案

public static readonly Dictionary<string, string> DynamicControls = new Dictionary<string, string> 
     { 
      { "UserCtrl1", "~/Controls/UserCtrl1.ascx" }, 
      { "UserCtrl2", "~/Controls/UserCtrl2.ascx" }, 
      { "UserCtrl3", "~/Controls/UserCtrl3.ascx" }, 
      { "UserCtrl4", "~/Controls/UserCtrl4.ascx"} 
}; 

現在讓我們比在該控件加載代碼的網頁上說是這樣的:

protected void Page_Load(object sender, EventArgs e) 
     { 
      SomePanel.Controls.Add(GetControl()); 
     }   

     private Control GetControl() 
     { 
      string dynamicCtrl = CurrentItem.DynamicControl; 
      string path = SomeClass.DynamicControls[dynamicCtrl]; 

      Control ctrl = null;    

      //TODO: find a better way to load the controls 
      switch (dynamicCtrl) 
      { 
       case "UserCtrl1": 
        { 
         ctrl = (UserCtrl1)LoadControl(path); 
        } 
        break; 
       case "UserCtrl2": 
        { 
         ctrl = (UserCtrl2)LoadControl(path); 
        } 
        break; 
       case "UserCtrl3": 
        { 
         ctrl = (UserCtrl3)LoadControl(path); 
        } 
        break; 
       default: 
        { 
         throw new ApplicationException("Invalid dynamic control added."); 
        }     
      } 

      return ctrl; 
     } 

頁面具有所需的註冊聲明。任何想法如何我可以擺脫這個醜陋的開關語句?

回答

9

您不需要從LoadControl轉換結果。

這應該這樣做:

private Control GetControl() 
{ 
    string dynamicCtrl = CurrentItem.DynamicControl; 
    string path = SomeClass.DynamicControls[dynamicCtrl]; 

    Control ctrl = LoadControl(path);  

    return ctrl; 
} 
+0

你可能也想運行在那裏的「內嵌溫度與查詢」重構..我會說nix的dynamicCtrl和CTRL變量..路徑艾滋病的可讀性,所以我會保持它。例如返回LoadControl(路徑) – Gishu 2008-11-11 10:52:12

0

你不能只在你的字典中使用foreach,並在那裏做你的測試和LoadControl?

0

這不會幫助,因爲需要切換到正確的控制類型。

1

你可能想是這樣的(僞上下的代碼):

 
foreach key in dictionary 
    if key = dynamicControl then 
     ctrl = (Type.GetType(key))LoadControl(dictionary.get(key)) 
    end if 
next