【问题标题】:Refactoring solution needed需要重构解决方案
【发布时间】:2008-11-11 09:41:27
【问题描述】:

我有一个页面,我必须根据用户选择动态加载控件。 假设我有这样的事情:

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;
        }

该页面具有所需的注册语句。知道如何摆脱这个丑陋的 switch 语句吗?

【问题讨论】:

    标签: c# asp.net refactoring


    【解决方案1】:

    您不需要从 LoadControl 转换结果。

    应该这样做:

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

    【讨论】:

    • 您可能还想在其中运行“带查询的内联温度”重构。我会说不使用 dynamicCtrl 和 ctrl 变量。路径有助于可读性,所以我会保留它。例如返回负载控制(路径)
    【解决方案2】:

    你可能想要这样的东西(伪代码):

    字典中的 foreach 键 如果 key = dynamicControl 那么 ctrl = (Type.GetType(key))LoadControl(dictionary.get(key)) 万一 下一个

    【讨论】:

      【解决方案3】:

      你能不能只在你的字典上使用 foreach 并在那里做你的测试和 LoadControl?

      【讨论】:

        【解决方案4】:

        这无济于事,因为转换为正确的控件类型需要开关。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-03-31
          • 1970-01-01
          • 1970-01-01
          • 2023-01-26
          • 2012-04-11
          • 2017-10-02
          • 2015-06-04
          • 2021-12-19
          相关资源
          最近更新 更多