2008-11-11 124 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