c#在我的case语句中删除重复项。使Case语句动态化

时间:2016-06-17 02:45:48

标签: c# .net visual-studio

有没有办法可以避免重复我的案例陈述?我希望我的代码尽可能动态。

 public void LoadTemplate()
        {
            switch (this.GetTemplate)
            {
                case 0://Default
                    this.configForm.txtDSN1.Text = Configuration.Default.ServerParameters.DSN.ToString();
                    this.configForm.comboServer.Text = Configuration.Default.ServerParameters.Server.ToString();
                    this.configForm.comboDatabase.Text = Configuration.Default.ServerParameters.Database.ToString();
                    break;
                case 1://Retail
                    this.configForm.txtDSN1.Text = Configuration.Retail.ServerParameters.DSN.ToString();
                    this.configForm.comboServer.Text = Configuration.Retail.ServerParameters.Server.ToString();
                    this.configForm.comboDatabase.Text = Configuration.Retail.ServerParameters.Database.ToString();
                    break;
                default:
                    break;
            }
        }

这是我在Configuration Class中的常量。

//Default Template
        public partial class Default
        { 
            public partial class ServerParameters
            {
                public const string DSN = "Default";
                public const string Server = "";
                public const string Database = "";
            }
        }
        //Retail Template
        public partial class Retail
        {
            public partial class ServerParameters
            {
                public const string DSN = "Retail1";
                public const string Server = "";
                public const string Database = "";
            }
        }

我是c#的新手我可以使用一个好习惯。感谢

3 个答案:

答案 0 :(得分:3)

您实际上是在尝试根据选择配置策略来定义配置行为。由于您已经拥有两个了解不同配置策略的类,因此您可能需要考虑重构类以遵循Strategy Pattern

  • 创建一个具有接受表单的方法的界面。
  • 让您的默认和零售类都实现该接口。该方法的每个实现都执行必要的表单配置。你甚至不再需要常数了。
  • 然后,这是一个解决策略的问题。这可以使用case语句,数据映射甚至依赖注入来完成。

答案 1 :(得分:0)

您可以使用反射进行以下操作:

    string className= this.GetTemplate==0?"Default":"Retail";

    Type objType = Type.GetType("Configuration."+className);
    object obj = Activator.CreateInstance(objType);
    objType.GetProperty(propName).GetValue(obj, null);

    this.configForm.txtDSN1.Text = objType.GetProperty("ServerParameters.DSN").GetValue(obj, null).ToString();
    this.configForm.comboServer.Text = objType.GetProperty("ServerParameters.Server").GetValue(obj, null).ToString();
    this.configForm.comboDatabase.Text = objType.GetProperty("ServerParameters.Database").GetValue(obj, null).ToString();

这是选择从中获取属性所需的类名,然后只需使用reflection从中获取属性。它可能不是最好的选择,但您可以使用它,而不是修改您的架构,如果它对您的应用程序有强大的影响。

答案 2 :(得分:0)

您可以通过为ServerParameters类型定义通用提供程序来使代码更加灵活。为此,请创建一个这样的提供者界面:

public interface IProvider<TId, TEntity>
{
     TEntity Provide(TId id);
}

然后,为此界面创建一个实现,该实现将根据模板代码或您用于识别模板的任何内容生成具有所需值的ServerParameters实例。

为此,您必须提取ServerParameters类并仅创建它的单个定义。另外,将ServerParameters中的属性定义更改为变量而不是常量。

然后,您的提供者实现将是这样的:

public class ServerParametersProvider : IProvider<int, ServerParameters>
{
     public ServerParameters Provide(int templateCode)
     {
          //For each templateCode return a ServerParameters instance with the required values.
          return null;
     }
}

然后,在包含LoadTemplate方法的类中,通过接口引用注入提供程序的实例。最后,您的LoadTemplate方法如下所示:

public void LoadTemplate()
{
     var parameters = m_Provider.Provide(GetTemplate);

     configForm.txtDSN1.Text = parameters.DSN;
     configForm.comboServer.Text = parameters.Server;
     configForm.comboDatabase.Text = parameters.Database;
}

这样,当您拥有需要为其提供值的另一个模板代码时,您的UI或LoadTemplate所在的任何上下文都不会更改,您只需更改提供程序以返回{的另一个实例{1}}具有不同的值。

您甚至可以通过让提供商依赖于特定模板代码的特定提供商来使代码更灵活,并根据它作为参数接收的代码委托给这些提供商。