我有一个开关语句,它根据从数据库中提取的数据引用不同的配置。配置的每一次迭代都有需要启用/修改的内容的变化。
我已经设置了一个方法,该方法接受每个配置的可变参数,并执行相关的逻辑,通常更改控件中的元素。我设置了4种重载方法,它们的控制类型各不相同。
SchemeConfigurationItems scis = sm.GetSchemeConfiguration(sid, TriState.True);
foreach (SchemeConfigurationItem sci in scis) {
// One of solution, other configuration items should be single items rather than grouping such as this.
switch (sci.ConfigurationTypeID)
{
case (int)ConfigurationType.GPDetails:
bool mandatory = sci.Mandatory;
pnlGP.Visible = true;
rfvGPName.Enabled = mandatory;
rfvGPPractice.Enabled = mandatory;
rfvGPPracticeAddress.Enabled = mandatory;
rfvGPPracticePostcode.Enabled = mandatory;
tbGPName.CssClass = MandatoryHandler(tbGPName.CssClass, mandatory);
tbGPPractice.CssClass = MandatoryHandler(tbGPPractice.CssClass, mandatory);
tbGPPracticeAddress.CssClass = MandatoryHandler(tbGPPracticeAddress.CssClass, mandatory);
tbGPPracticePostcode.CssClass = MandatoryHandler(tbGPPracticePostcode.CssClass, mandatory);
break;
case (int)ConfigurationType.ReferralOwner:
configHandler(sci, ddlOwners, isReferralOwnerConfig, rfvOwners);
break;
case (int)ConfigurationType.RequiresAssessmentsPassed:
break;
case (int)ConfigurationType.ReferralDateReceived:
configHandler(sci, tbReferralReceivedDate, isReferralDateReceivedConfig, rfvReferralReceivedDate ,pnlReferralReceivedDate);
break;
case (int)ConfigurationType.ReasonForReferral:
configHandler(sci, tbReason, isReasonForReferralConfig, rfvReason, pnlReason);
break;
case (int)ConfigurationType.HealthCheck:
configHandler(sci, rblHealthCheck, isHealthCheckConfig, rfvHealthCheck, pnlHealthCheck);
break;
case (int)ConfigurationType.PersonalSafety:
configHandler(sci, rblPersonalSafety, isPersonalSafetyConfig, rfvrblPersonalSafety, pnlPersonalSafety);
break;
case (int)ConfigurationType.PersonalSafetyDetail:
configHandler(sci, tbPersonalSafety, isPersonalSafetyDetailConfig, rfvtbPersonalSafety, pnlPersonalSafetyDetail);
break;
case (int)ConfigurationType.ServiceAwarenessMethod:
configHandler(sci, ddlServiceAwarenessMethod, isServiceAwarenessMethodConfig, pnl: pnlServiceAwarenessMethod);
break;
case (int)ConfigurationType.ActivitySelection:
configHandler(sci, cbActivitySelection, isActivitySelectionConfig, pnl: pnlActivitySelection);
break;
case (int)ConfigurationType.StatLog:
configHandler(sci: sci, pnl: pnlStatLog, def: "");
break;
}
}这是开关语句的一部分,大约有50,这是一般流程的方式。
public void configHandler(SchemeConfigurationItem sci = null, DropDownList ddl = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null, string def = "")
{
if (pnl != null)
{
pnl.Visible = Convert.ToBoolean(sci.Active);
}
if (Convert.ToBoolean(sci.Active))
{
Config = true;
if (ddl != null)
{
ddl.CssClass = sci.CssClass != String.Empty ? sci.CssClass : ddl.CssClass;
ddl.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : ddl.ToolTip;
ddl.CssClass = MandatoryHandler(ddl.CssClass, rfv.Enabled);
}
if (rfv != null)
{
rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
}
}
}
public void configHandler(SchemeConfigurationItem sci = null, TextBox tb = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null)
{
if (pnl != null)
{
pnl.Visible = Convert.ToBoolean(sci.Active);
}
if (Convert.ToBoolean(sci.Active))
{
Config = true;
if (tb != null)
{
tb.CssClass = sci.CssClass != String.Empty ? sci.CssClass : tb.CssClass;
tb.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : tb.ToolTip;
tb.CssClass = MandatoryHandler(tb.CssClass, rfv.Enabled);
}
if (rfv != null)
{
rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
}
}
}
public void configHandler(SchemeConfigurationItem sci = null, RadioButtonList rbl = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null)
{
if (pnl != null)
{
pnl.Visible = Convert.ToBoolean(sci.Active);
}
if (Convert.ToBoolean(sci.Active))
{
Config = true;
if (rbl != null)
{
rbl.CssClass = sci.CssClass != String.Empty ? sci.CssClass : rbl.CssClass;
rbl.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : rbl.ToolTip;
rbl.CssClass = MandatoryHandler(rbl.CssClass, rfv.Enabled);
}
if (rfv != null)
{
rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
}
}
}
public void configHandler(SchemeConfigurationItem sci = null, CheckBoxList cbl = null, bool Config = true, RequiredFieldValidator rfv = null, Panel pnl = null)
{
if (pnl != null)
{
pnl.Visible = Convert.ToBoolean(sci.Active);
}
if (Convert.ToBoolean(sci.Active))
{
Config = true;
if (cbl != null)
{
cbl.CssClass = sci.CssClass != String.Empty ? sci.CssClass : cbl.CssClass;
cbl.ToolTip = sci.ToolTip != String.Empty ? sci.ToolTip : cbl.ToolTip;
cbl.CssClass = MandatoryHandler(cbl.CssClass, rfv.Enabled);
}
if (rfv != null)
{
rfv.Enabled = Convert.ToBoolean(sci.Mandatory);
rfv.ErrorMessage = sci.ErrorMessage != String.Empty ? sci.ErrorMessage : rfv.ErrorMessage;
}
}
}下面是重载的方法,您可以看到所有参数都是可选的,以允许各种配置。有些人可能会注意到第一个方法中的string def = "",在本例中,如果没有包含键参数,则实现这个方法是为了针对一个默认方法-- Control。
我正在寻找使解决方案更整洁、更干净和更小的方法。
发布于 2016-09-27 14:27:20
SchemeConfigurationItem sci = null参数不需要是可选的,因为您总是传递一个不能是null的参数。PascalCase大小写来命名。sci或pnlGP这样的名字不会告诉你它是关于什么的。发布于 2016-09-27 15:22:29
所有的configHandler方法都只有一个参数不同,而且它们都是相同的。您还对每个控件使用相同的属性(第二个参数)。
您应该为它创建一个接口。
public interface IStyleable
{
string CssClass { get; set; }
string ToolTip { get; set; }
}您将通过一个包含所有参数的configHandler类传递给单个ConfigProperties:
public void configHandler(ConfigParameters configParams = null)
{
configParams = configParams ?? new ConfigParameters();
if (configParams.Panel != null)
{
configParams.Panel.Visible = Convert.ToBoolean(configParams.SchemeConfigurationItem.Active);
}
if (Convert.ToBoolean(configParams.SchemeConfigurationItem.Active))
{
Config = true;
if (configParams.Control != null)
{
configParams.Control.CssClass = string.IsNullOrEmpty(configParams.SchemeConfigurationItem.CssClass) ? configParams.Control.CssClass : configParams.SchemeConfigurationItem.CssClass;
configParams.Control.ToolTip = string.IsNullOrEmpty(configParams.SchemeConfigurationItem.ToolTip) ? configParams.Control.ToolTip : configParams.SchemeConfigurationItem.ToolTip;
configParams.Control.CssClass = MandatoryHandler(configParams.Control.CssClass, configParams.RequiredFieldValidator.Enabled);
}
if (configParams.RequiredFieldValidator != null)
{
configParams.RequiredFieldValidator.Enabled = Convert.ToBoolean(configParams.SchemeConfigurationItem.Mandatory);
configParams.RequiredFieldValidator.ErrorMessage = string.IsNullOrEmpty(configParams.SchemeConfigurationItem.ErrorMessage) ? configParams.RequiredFieldValidator.ErrorMessage : configParams.SchemeConfigurationItem.ErrorMessage;
}
}
}这样,您就可以单独配置每个参数,而不必显式地将其他参数设置为null:
configHandler(new ConfigParameters
{
SchemeConfigurationItem = ...,
Control = someCheckBoxList
});这些参数是:
public class ConfigParameters
{
public SchemeConfigurationItem SchemeConfigurationItem { get; set; }
public IStyleable Control { get; set; }
public bool Config { get; set; }
public RequiredFieldValidator RequiredFieldValidator { get; set; }
public Panel Panel { get; set; }
}https://codereview.stackexchange.com/questions/142604
复制相似问题