【发布时间】:2019-04-12 19:40:41
【问题描述】:
有一个方法接受2个参数:
int selectedClass;
int selectedFunction;
接下来,有 2 个 switch 语句。首先,它使用枚举来确定子类类型:
ParentClass p;
switch(selectedClass){
case (int)ClassTypes.A:
p = new classA();
break;
case (int)ClassTypes.B:
p = new classB();
break;
case (int)ClassTypes.C:
p = new classC();
break;
}
然后它会持续 50 多个语句。此外,还有另一个决定函数的 switch 语句:
string result;
switch(selectedFunction){
case (int)FunctionTypes.Func1:
result = p.function1();
break;
case (int)FunctionTypes.Func2:
result = p.function2();
break;
case (int)FunctionTypes.Func3:
result = p.function3();
break;
}
我确实使用了搜索,有很多改进第二个 switch 语句的例子,但不是第一个。第一个问题是:我们如何在没有 switch 语句的情况下确定子类和函数?
第二个:在 js 中我会做这样的事情:
functionsArray[selectedClass][selectedFunction]();
是否可以在 c# 中实现类似的映射?
更新#1: 我已将第一个开关替换为以下代码:
public static Dictionary<ClassTypes, Type> typeDict = new Dictionary<ClassTypes, Type>()
{
{ ClassTypes.A , typeof(classA) },
{ ClassTypes.B , typeof(classB) },
{ ClassTypes.C , typeof(classC) }
};
ParentClass p = (ParentClass)Activator.CreateInstance(typeDict[selectedClass]);
【问题讨论】:
-
创建一个所有类都实现的通用基类/接口,然后简单地调用
myInstance.TheSingleFunction()? -
如您所见,已经有一个带有虚函数的基类,我确实从像
p.function3()这样的父类调用函数。此外,在该项目中创建界面不会按设计进行。 -
但是你的基类中没有三个方法,只需要一个所有 yopur 派生类都实现的方法。这样您就不必打开方法,而只需打开类型。
-
可能字典风格更好——在使用中然后切换,切换在少数情况下很好,否则可读性很差。性能相似 - 开关变成了基于哈希的搜索
-
如果您传入类型而不是 int 并使用 Activator.CreateInstance
(); ,则可以轻松解决第一个开关
标签: c# .net switch-statement mapping