You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 00:55:03