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

C# 如何为菜单项添加无限数量的可选附加项及对应加价规则

方案选择

推荐选择单套「选项/价格」结构动态添加的方案,不要预定义固定槽位,原因如下:

  • 无数量限制:不受预定义的7-8个槽位约束,后续不管单个菜品需要多少附加选项都可以直接扩展,不需要修改底层数据结构
  • 适配UI设计:和你设计的卡片布局+添加按钮交互完全匹配,渲染时直接遍历已有的选项集合输出即可,不需要处理空槽位的兼容逻辑
  • 维护成本更低:后续如果需要给附加选项增加属性(比如可选数量上限、是否必选、库存状态等),只需要调整选项类的定义即可,不需要修改菜单项的结构
代码结构调整

原有设计让MenuItem继承IMenuOption是不合理的,二者是包含关系而非继承关系,且接口定义的void方法不符合存取选项名、价格的需求,调整后的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;

namespace MenuConsole
{
    // 调整接口定义,用属性替代无返回值方法
    public interface IMenuOption
    {
        string OptionName { get; set; }
        decimal OptionPrice { get; set; }
    }

    // 附加选项类实现接口
    public class MenuAddonOption : IMenuOption
    {
        public string OptionName { get; set; }
        public decimal OptionPrice { get; set; }
    }

    // 菜单项类,独立定义,包含附加选项集合
    public class MenuItem
    {
        public string MenuItemName { get; set; }
        public decimal MenuItemPrice { get; set; }
        // 动态存储所有附加选项,没有数量限制
        public List<IMenuOption> AddonOptions { get; set; } = new List<IMenuOption>();

        // 可选:提供计算选中选项总价的方法,可根据实际需求调整
        public decimal GetTotalPrice(List<string> selectedOptionNames)
        {
            var addonTotal = AddonOptions
                .Where(o => selectedOptionNames.Contains(o.OptionName))
                .Sum(o => o.OptionPrice);
            return MenuItemPrice + addonTotal;
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            // 示例用法
            var hamburger = new MenuItem
            {
                MenuItemName = "牛肉汉堡",
                MenuItemPrice = 5.99m
            };
            // 动态添加选项,对应UI的添加按钮操作
            hamburger.AddonOptions.Add(new MenuAddonOption { OptionName = "培根", OptionPrice = 1.00m });
            hamburger.AddonOptions.Add(new MenuAddonOption { OptionName = "蘑菇", OptionPrice = 0.50m });
            hamburger.AddonOptions.Add(new MenuAddonOption { OptionName = "芝士", OptionPrice = 0.30m });

            Console.WriteLine($"菜品:{hamburger.MenuItemName},基础价:{hamburger.MenuItemPrice:C}");
            Console.WriteLine("可选附加项:");
            foreach (var option in hamburger.AddonOptions)
            {
                Console.WriteLine($"- {option.OptionName}:+{option.OptionPrice:C}");
            }
        }
    }
}
操作说明
  • UI点击添加按钮时,只需要实例化一个新的MenuAddonOption对象,添加到对应MenuItem的AddonOptions集合中,再刷新卡片的选项列表展示即可
  • 如果后续需要支持不同类型的附加选项(比如配料类、尺寸类),只需要新增实现IMenuOption的子类即可,不需要修改现有逻辑

内容的提问来源于stack exchange,提问作者user1895831

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:24:02