C# 重构开关盒 请考虑这个PSUDO代码: switch (ddlPlan.SelectedValue) { #region 02 case "2": BL_02 bl_02 = new BL_02(); bl_02.DeleteQues(Id, Version); break; #endregion #region 0503 case "3": BL_03 bl_03 = new BL_03(); bl_03.DeleteQues(Id, Version); break; #endregion #region 0505 case "5": BL_05 bl_05 = new BL_05(); bl_05.DeleteQues(Id, Version); break; #endregion }
如何重构此代码以删除此开关案例 我的大部分问题是如何以适当的方式获取C# 重构开关盒 请考虑这个PSUDO代码: switch (ddlPlan.SelectedValue) { #region 02 case "2": BL_02 bl_02 = new BL_02(); bl_02.DeleteQues(Id, Version); break; #endregion #region 0503 case "3": BL_03 bl_03 = new BL_03(); bl_03.DeleteQues(Id, Version); break; #endregion #region 0505 case "5": BL_05 bl_05 = new BL_05(); bl_05.DeleteQues(Id, Version); break; #endregion },c#,c#-4.0,design-patterns,refactoring,C#,C# 4.0,Design Patterns,Refactoring,如何重构此代码以删除此开关案例 我的大部分问题是如何以适当的方式获取BLs的实例 谢谢假设每个类都是BL_Parent的子类,您可以使用反射从字符串值动态实例化该类 var className = String.format("BL_{0,2}", ddlPlan.SelectedValue); var blObj = (BL_Parent)Activator.CreateInstance(null, className); blObj.DeleteQues(Id, Version); 如
BLs
的实例
谢谢假设每个类都是
BL_Parent
的子类,您可以使用反射从字符串值动态实例化该类
var className = String.format("BL_{0,2}", ddlPlan.SelectedValue);
var blObj = (BL_Parent)Activator.CreateInstance(null, className);
blObj.DeleteQues(Id, Version);
如果您只需要一组可用的数字,您可以这样将它们列为白名单
var whitelist = new string[] { "2", "3", "5" };
if (!whitelist.Contains(ddlPlan.SelectedValue))
// handle exception
您可以找到有关Activator.CreateInstance()的更多信息
另外,我建议您重新考虑您的类结构,因为根据命名约定,有更好的方法处理这样的数据。假设每个类都是
BL\u Parent
的子类,您可以使用反射从字符串值动态实例化类
var className = String.format("BL_{0,2}", ddlPlan.SelectedValue);
var blObj = (BL_Parent)Activator.CreateInstance(null, className);
blObj.DeleteQues(Id, Version);
如果您只需要一组可用的数字,您可以这样将它们列为白名单
var whitelist = new string[] { "2", "3", "5" };
if (!whitelist.Contains(ddlPlan.SelectedValue))
// handle exception
您可以找到有关Activator.CreateInstance()的更多信息
另外,我建议您重新考虑您的类结构,因为从命名约定来看,有更好的方法来处理这样的数据。这样的东西怎么样 把它放在某个地方,然后让你的BL类实现它:
public interface IBL
{
void DeleteQues(string id, string version); // Assuming these are strings
}
然后重写switch语句,如下所示:
IBL bl;
switch (ddlPlan.SelectedValue)
{
case "2": bl = new BL_02(); break;
case "3": bl = new BL_03(); break;
case "5": bl = new BL_05(); break;
}
bl.DeleteQues(Id, Version);
或者,您可以创建字典
,而不是使用开关:
Dictionary<string, Type> blTypes = new Dictionary<string, Type>
{
{ "2", typeof(BL_02) },
{ "3", typeof(BL_03) },
{ "5", typeof(BL_05) }
}
或者,如果您真的想让它变得有趣并具有可伸缩性,您可以使用反射来生成要实例化的类的名称。这样的东西怎么样 把它放在某个地方,然后让你的BL类实现它:
public interface IBL
{
void DeleteQues(string id, string version); // Assuming these are strings
}
然后重写switch语句,如下所示:
IBL bl;
switch (ddlPlan.SelectedValue)
{
case "2": bl = new BL_02(); break;
case "3": bl = new BL_03(); break;
case "5": bl = new BL_05(); break;
}
bl.DeleteQues(Id, Version);
或者,您可以创建字典
,而不是使用开关:
Dictionary<string, Type> blTypes = new Dictionary<string, Type>
{
{ "2", typeof(BL_02) },
{ "3", typeof(BL_03) },
{ "5", typeof(BL_05) }
}
或者,如果你真的想让它变得更花哨,更具可扩展性,您可以使用反射来生成要实例化的类的名称。每个
BL_???
是否与DeleteQues
方法共享一个公共基类?谢谢亲爱的@Enigmativity。您可以编写建议的代码作为答案吗?请回答我的问题。如果不知道你的代码是如何编写的,我就无法给你一个好的答案。每个BL_???
是否与DeleteQues
方法共享一个公共基类?谢谢亲爱的@Enigmativity。你能写下建议的代码作为答案吗?请回答我的问题。如果不知道你的代码是如何编写的,我就不能给你一个好的答案。