如何在C#中利用字典根据整数值切换不同类?
使用字典简化C#中根据整数切换类的逻辑
当然可行,通过定义共同接口+字典映射的方式,能彻底替代冗长的多分支if语句,代码更简洁易维护。具体步骤如下:
1. 定义统一接口
让所有需要切换的类实现同一个接口,保证它们都暴露可访问的数组属性:
public interface IVarListProvider { string[] VarList { get; } }
修改你的类以实现该接口:
public class myclass1 : IVarListProvider { // 复用原有数组,适配接口要求的属性 public string[] VarList => varlist; private string[] varlist = new string[999]; // 你的原有数组定义 } // myclass2、myclass3等类按同样方式实现IVarListProvider接口
2. 用字典建立映射关系
把var1的数值和对应类的实例绑定到字典中,替代原来单独声明的多个类实例:
// 初始化字典:键对应var1的取值,值是对应类的实例 private Dictionary<int, IVarListProvider> _classMap = new Dictionary<int, IVarListProvider> { { 1, new myclass1() }, { 2, new myclass2() }, { 3, new myclass3() } // 其他类按同样格式添加即可 }; int var1 = 0; string[] myvar = new string[999];
3. 重构my_method方法
直接通过字典获取对应类实例,完成数组赋值,彻底去掉if分支:
public void my_method() { // 检查var1是否存在有效映射 if (_classMap.TryGetValue(var1, out var targetClass)) { // 直接复制整个数组,比逐个循环赋值效率更高 Array.Copy(targetClass.VarList, myvar, myvar.Length); // 如果必须逐个元素处理(比如有额外逻辑),再用循环: // for (int j = 0; j < myvar.Length; j++) // { // myvar[j] = targetClass.VarList[j]; // } } else { // 处理var1无效的情况,比如抛出异常或设置默认值 // throw new ArgumentException($"不存在对应var1={var1}的类"); } }
进阶优化:延迟实例化
如果你的类初始化成本较高,可以用字典存储工厂方法,在需要时才创建实例:
private Dictionary<int, Func<IVarListProvider>> _classFactoryMap = new Dictionary<int, Func<IVarListProvider>> { { 1, () => new myclass1() }, { 2, () => new myclass2() }, { 3, () => new myclass3() } }; // 使用时 public void my_method() { if (_classFactoryMap.TryGetValue(var1, out var factory)) { var targetClass = factory(); Array.Copy(targetClass.VarList, myvar, myvar.Length); } }
内容的提问来源于stack exchange,提问作者Mdarende
相关产品推荐
相关产品推荐

