早!
我正在编写一个有很多菜单项的新软件。目前我有嵌入式XML中定义的菜单结构,以及每个项目的权限,菜单绘制正确。
我正在提出一些关于将每个菜单项链接到一个方法的最佳方法的建议,该方法将在选择时运行。刚才,每个菜单项都有一个唯一的ID,所以我想我所有的菜单项都会调用一个方法然后调用该菜单项的特定方法,但我想知道是否有更好的方法可以做此
此外,使用存储在字符串中的方法名称调用方法的最佳方法是什么。我有一个名为“MenuOption_xxx”的方法,其中xxx是ID - 但我需要在选择菜单项时调用该方法。
赞赏任何指针或更好的建议, 欢呼声。
答案 0 :(得分:1)
尝试使用Reflection
,例如按名称调用对象方法:
Type yourType= yourObject.GetType();
MethodInfo theMethod = thisType.GetMethod("MenuOption_xxx");
theMethod.Invoke(this, null);
您可以将菜单Tag
属性设置为标识符:
menuItem1.Tag = "X"; // name or id of this menuitem
menuItem2.Tag = "XX";
menuItem3.Tag = "XXX";
然后设置Click
事件:
menuItem1.Click += MenuItem_Click;
menuItem2.Click += MenuItem_Click;
menuItem3.Click += MenuItem_Click;
在Click
事件:
private void MenuItem_Click(object sender, EventArgs e)
{
var id = (String) ((MenuItem))sender.Tag;
// use reflection:
Type yourType= yourObject.GetType();
MethodInfo theMethod = thisType.GetMethod(String.Format("MenuOption_{0}", id));
theMethod.Invoke(this, null);
}
public void MenuOption_X
{
...
}
public void MenuOption_XX
{
...
}
答案 1 :(得分:1)
我认为代表的解决方案看起来像这样:
public class MenuItem
{
public delegate ActionResult MenuAction(ActionParams params);
}
您应该声明ActionResult和ActionParams类,并在其中包含您需要的所有成员。你甚至可以将它们抽象化并从每个案例中继承它们。
然后,从代码中,调用MenuAction将如下所示:
var closeWindow = new MenuItem{.......}; //initialize your variable or call a constructor
var result = closeWindow.MenuAction(params); //pass some params