Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
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 - Fatal编程技术网

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。你能写下建议的代码作为答案吗?请回答我的问题。如果不知道你的代码是如何编写的,我就不能给你一个好的答案。