有没有办法可以避免重复我的案例陈述?我希望我的代码尽可能动态。
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#的新手我可以使用一个好习惯。感谢
答案 0 :(得分:3)
您实际上是在尝试根据选择配置策略来定义配置行为。由于您已经拥有两个了解不同配置策略的类,因此您可能需要考虑重构类以遵循Strategy Pattern。
答案 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}}具有不同的值。
您甚至可以通过让提供商依赖于特定模板代码的特定提供商来使代码更灵活,并根据它作为参数接收的代码委托给这些提供商。