switch和硬编码字典的等效性

背景

写背包系统时点击物品格子,出现详情页,详情页的选项按钮根据物品种类、所属容器动态生成。这里生成选项按钮取决于的"键"有多个:物品种类、所属容器,执行的操作是生成几个按钮,写入名称、添加回调。按常规思路会写成2层判断,一个长度恐怖的函数。

改进

经过豆包的启发:

  1. 双键可以使用Tuple<>;
  2. switch可以用硬编码字典;
  3. case后面的操作可以用委托存放;

变成了这样一个硬编码字典:虽然还是很长,但是比原来的写法(200多行)已经好多了,而且更整齐了。

cs 复制代码
public class ButtonConfig
{
    public string hint;
    public UnityAction callback;
}
Dictionary<(CellLocation, Props_Type), List<ButtonConfig>> buttonConfigs;
void InitOptionConfigs()
{
    buttonConfigs = new() {
        //场景内物品选项
        {(CellLocation.Scene,Props_Type.Gun),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ TakeGunFromGround(cellSelected);} } } },
        {(CellLocation.Scene, Props_Type.Mag),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ PickMagFromScene(cellSelected);} } }},
        {(CellLocation.Scene, Props_Type.Medicine),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ PickFromScene(cellSelected);} } }},
        {(CellLocation.Scene, Props_Type.Grenade),
            new(){ new ButtonConfig { hint="拾取",callback=()=>{ PickFromScene(cellSelected);} } }},
        //玩家背包内物品选项
        {(CellLocation.PlayerPack, Props_Type.Mag),
        new (){new ButtonConfig {hint="放下",callback=()=> { if (putIn){PutMagInCrate(cellSelected);
            }else{DropMag(cellSelected);} } } }},
        {(CellLocation.PlayerPack, Props_Type.Medicine),
        new (){new ButtonConfig {hint="放下",callback=PutItem},
            new ButtonConfig{hint="使用",callback=TryUseMedicine} } },
        {(CellLocation.PlayerPack, Props_Type.Grenade),
        new(){ new ButtonConfig {hint="放下",callback= PutItem },
        new ButtonConfig{hint="使用",callback=TryUseGrenade } } },
        //其他容器内物品选项
        {(CellLocation.OtherPack, Props_Type.Mag),
        new(){ new ButtonConfig {hint="拾取",callback=()=>{PickMagFromCrate(cellSelected);} }}},
        {(CellLocation.OtherPack, Props_Type.Medicine),
        new(){new ButtonConfig {hint="拾取",callback=()=>{PickFromCrate(cellSelected);} } } },
        {(CellLocation.OtherPack, Props_Type.Grenade),
        new(){new ButtonConfig {hint="拾取",callback=()=>{PickFromCrate(cellSelected);} } } },
        {(CellLocation.OtherPack, Props_Type.Gun),
        new(){ new ButtonConfig {hint="拾取",callback=()=> { TakeGunFromCrate(cellSelected); } } } }
    };
}
相关推荐
dzj202111 分钟前
PointerEnter、PointerExit、PointerDown、PointerUp——鼠标点击物体,则开始旋转,鼠标离开或者松开物体,则停止旋转
unity·pointerdown·pointerup
kylezhao20191 小时前
深入浅出地理解 C# WPF 中的属性
hadoop·c#·wpf
心前阳光1 小时前
Unity 模拟父子关系
android·unity·游戏引擎
多多*2 小时前
2月3日面试题整理 字节跳动后端开发相关
android·java·开发语言·网络·jvm·adb·c#
一念春风2 小时前
C# 通用工具类代码
c#
海盗12343 小时前
WPF上位机组件开发-设备状态运行图基础版
开发语言·c#·wpf
浮生如梦_4 小时前
C# 窗体工厂类 - 简单工厂模式演示案例
计算机视觉·c#·视觉检测·简单工厂模式
两千次4 小时前
web主从站
windows·c#
lihongli0004 小时前
四连杆机构驱动角与被驱动连杆角度关系
c#
℡枫叶℡4 小时前
C# - 指定友元程序集
开发语言·c#·友元程序集