2

早晨!

我目前正在编写一个有很多菜单项的新软件。目前,我在嵌入式 XML 中定义了菜单结构,以及每个项目的权限,并且菜单可以正确绘制。

我正在就将每个菜单项链接到在选择它时将运行的方法的最佳方法提出一些建议。刚才,每个菜单项都有一个唯一的 ID,所以我想我会让所有菜单项调用一个方法,然后为该菜单项调用一个特定的方法,但我想知道是否有更好的方法这。

此外,使用存储在字符串中的方法名称调用方法的最佳方法是什么。我有名为“MenuOption_xxx”的方法,其中 xxx 是 ID - 但我需要在选择菜单项时调用该方法。

感谢任何指针或更好的建议,干杯。

4

2 回答 2

1

尝试使用Reflection,例如按名称调用对象方法:

Type yourType= yourObject.GetType();
MethodInfo theMethod = thisType.GetMethod("MenuOption_xxx"); 
theMethod.Invoke(this, null); 

您可以将 menusTag属性设置为标识符:

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
{
 ...
}
于 2012-10-09T08:03:04.943 回答
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
于 2012-10-09T08:13:33.187 回答