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

能否向类传递函数?控制台菜单选项绑定执行方法的技术问询

实现菜单选项绑定执行方法的方案

完全可行,你只需要在MenuOption类中添加一个用于存储执行逻辑的委托属性,就能实现选择菜单后调用Execute()触发对应工具类方法的需求。

修改后的MenuOption类

using System;
using System.Collections.Generic;
using System.Text;

public class MenuOption
{
    // 用于存储菜单选项对应的执行逻辑
    public Action? OnExecute { get; set; }

    public MenuOption()
    {
    }

    public MenuOption(ConsoleKey key, string optionLabel, string optionText)
    {
        Key = key;
        OptionLabel = optionLabel;
        OptionText = optionText;
    }

    public MenuOption(ConsoleKey key, string optionLabel, string optionText, List<MenuOption> subMenu)
    {
        Key = key;
        OptionLabel = optionLabel;
        OptionText = optionText;
        SubMenu = subMenu;
    }

    // 添加带执行逻辑的构造函数,更方便创建选项
    public MenuOption(ConsoleKey key, string optionLabel, string optionText, Action executeAction)
    {
        Key = key;
        OptionLabel = optionLabel;
        OptionText = optionText;
        OnExecute = executeAction;
    }

    public ConsoleKey? Key { get; set; } = null;
    public string OptionLabel { get; set; } = string.Empty;
    public string OptionText { get; set; } = string.Empty;
    public List<MenuOption> SubMenu { get; set; } = new List<MenuOption>();

    public string Display()
    {
        StringBuilder menu = new StringBuilder();
        menu.AppendLine("Press the number associated with the option of your choice or [Esc] to exit.");
        foreach (MenuOption option in SubMenu)
        {
            if (option.Key == ConsoleKey.Escape)
            {
                menu.AppendLine($"{option.OptionLabel} {option.OptionText}");
            }
            else
            {
                menu.AppendLine($"{option.OptionLabel}. {option.OptionText}");
            }
        }
        return menu.ToString();
    }

    // 执行绑定的逻辑
    public void Execute()
    {
        OnExecute?.Invoke();
    }
}

绑定工具类方法的示例

假设你有一个工具类ToolClass:

public static class ToolClass
{
    public static void DoSomething()
    {
        Console.WriteLine("执行了工具类的DoSomething方法");
    }

    public static void ShowSettings()
    {
        Console.WriteLine("显示设置界面");
    }
}

创建菜单选项时直接绑定工具类方法:

// 创建主菜单选项
var mainMenu = new MenuOption
{
    SubMenu = new List<MenuOption>
    {
        new MenuOption(ConsoleKey.D1, "1", "执行操作", ToolClass.DoSomething),
        new MenuOption(ConsoleKey.D2, "2", "查看设置", ToolClass.ShowSettings),
        new MenuOption(ConsoleKey.Escape, "[Esc]", "退出程序", () => Environment.Exit(0))
    }
};

// 模拟用户选择后的执行逻辑
Console.WriteLine(mainMenu.Display());
Console.Write("请选择选项:");
var key = Console.ReadKey(true).Key;

var selectedOption = mainMenu.SubMenu.FirstOrDefault(o => o.Key == key);
selectedOption?.Execute();

这样用户选择对应选项后,调用selectedOption.Execute()就会触发绑定的工具类方法,完全符合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:17:31