需要帮助理解动态菜单在我的c#控制台应用程序

本文关键字:我的 控制台 应用程序 菜单 动态 帮助 助理 | 更新日期: 2023-09-27 18:11:43

我试图设计一个控制台应用程序,其中菜单是从某种类型的数据结构生成的,每个菜单项可以有指定的处理程序/操作(可能只是显示不同的菜单)。抱歉,如果这听起来已经很复杂了!

我很难找出正确的方法来做这件事。这是我的第一个c#应用程序,我觉得我已经读了几个小时的委托,我仍然不确定我是否应该使用它们。

我有很多现有的代码,但我觉得它可能会更好,如果我得到一些总体方向之前,试图修复什么是潜在的破坏的基础。我将试着描述我正在做的事情:

  • 创建一个"Menu"类,由一个菜单标题和任意数量的菜单项组成。
  • 每个"菜单项"由热键、描述和"指向处理程序的指针"组成。
  • Handler完成工作并返回菜单。

我遇到麻烦的是这个"指向处理程序的指针"。这个处理程序应该如何在MenuItem对象中表示?如何从菜单提示调用处理程序?我是不是用了完全错误的方法?

希望这是有意义的:)

需要帮助理解动态菜单在我的c#控制台应用程序

我认为委托可能是一个很好的起点。首先,因为它们在c#中相当流行,而且因为你刚开始学习c#,这可能是一个很好的实践。其次,使用委托实现应用程序应该相当简单。

让我们考虑Action<T>Func<T>委托。第一个可以执行一些操作,但不会返回任何值。第二个返回类型为t的值。这两种类型最多可以有16个参数。基本上,它们的主要行为是作为方法的占位符。

那么让我们看一些例子,嵌入在应用程序的上下文中:

public class MenuItem<T>
{
    public string Description { get; set; }
    public char HotKey { get; set; }
    public Func<T> FirstHandler { get; set; }       // returns some value
    public Action<T> SecondHandler { get; set; }    // does not return any value
    // let's use this method to invoke the first handler
    public T DoSomething()
    {
        // this handler is of type Func<T> so it will return a value of type T
        return this.FirstHandler.Invoke();
    }
    // let's use this method to invoke the second handler
    public void DoSomethingElse(T input)
    {
        this.SecondHandler.Invoke(input);
    }
}

Func的情况下,如果它有多个参数,最后一个是返回类型。其他是输入类型。因此,例如Func<int, char, string>将接受一个以intchar作为输入但返回string的方法。你可以从Visual Studio得到一些帮助——在委托描述中,它在参数前面显示inout字样,以表明它是输入参数还是输出参数。

现在,创建了MenuItem类,您可以以以下方式使用它:

class Program
{
    // A method that takes no input arguments but returns string
    private static string ReturnHelloWorld()
    {
        return "Hello World";
    }
    static void Main(string[] args)
    {
        MenuItem<string> menuItem = new MenuItem<string>();
        // FirstHandler signature is Func<T>
        // So it doesn't take any input arguments
        // and returns T - in our case string
        menuItem.FirstHandler = ReturnHelloWorld;
        // SecondHandler signature is Action<T>
        // So it takes one input argument of type T (here, string)
        // and returns void
        menuItem.SecondHandler = Console.WriteLine;
        // Now use a method of MenuItem class to invoke FirstHandler.
        string menuItemMessage = menuItem.DoSomething();
        // Use another method to invoke SecondHandler.
        menuItem.DoSomethingElse(menuItemMessage);
    }
}

请注意,这只是您的问题的一个非常基本的起点。但是它允许您创建菜单项并为这些项分配不同的行为。

相关文章: