需要帮助理解动态菜单在我的c#控制台应用程序
本文关键字:我的 控制台 应用程序 菜单 动态 帮助 助理 | 更新日期: 2023-09-27 18:11:43
我试图设计一个控制台应用程序,其中菜单是从某种类型的数据结构生成的,每个菜单项可以有指定的处理程序/操作(可能只是显示不同的菜单)。抱歉,如果这听起来已经很复杂了!
我很难找出正确的方法来做这件事。这是我的第一个c#应用程序,我觉得我已经读了几个小时的委托,我仍然不确定我是否应该使用它们。
我有很多现有的代码,但我觉得它可能会更好,如果我得到一些总体方向之前,试图修复什么是潜在的破坏的基础。我将试着描述我正在做的事情:
- 创建一个"Menu"类,由一个菜单标题和任意数量的菜单项组成。
- 每个"菜单项"由热键、描述和"指向处理程序的指针"组成。
- Handler完成工作并返回菜单。
我遇到麻烦的是这个"指向处理程序的指针"。这个处理程序应该如何在MenuItem对象中表示?如何从菜单提示调用处理程序?我是不是用了完全错误的方法?
希望这是有意义的:)
我认为委托可能是一个很好的起点。首先,因为它们在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>
将接受一个以int
和char
作为输入但返回string
的方法。你可以从Visual Studio得到一些帮助——在委托描述中,它在参数前面显示in
和out
字样,以表明它是输入参数还是输出参数。
现在,创建了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);
}
}
请注意,这只是您的问题的一个非常基本的起点。但是它允许您创建菜单项并为这些项分配不同的行为。