C#在运行时构建菜单,commandHandlers和hashtable

时间:2012-05-15 15:05:07

标签: c# menu menuitem

我(非常)是C#的新手,我正在尝试用这种语言实现现有的应用程序元模型。在这个元模型中,有一个"菜单" table包含表单和操作的组合,为每个表单指示哪些操作应该可用。

然后我可以使用这个"菜单" datasource用于在运行时构建和显示表单的特定MenuStrip。菜单中的每个项目(ToolStripMenuItem)都包含相应的'操作'串。单击此项应启动相应的命令。

现在问题是:如何将ToolStripmenuItem的操作字符串链接到相应的命令?

我的第一个想法是维护一个包含操作字符串作为键的HashTable,以及要执行的方法,如下所示:

一个通用的CommandHandler方法:

delegate void CommandHandler(string[] args);

,在我的主模块中,看起来像这样的HashTable

myHashCommandTable.Add 
    (   "issueThePurchaseOrder", 
        new CommandHandler(PurchaseOrder.IssueThePurchaseOrder))

然后我可以在运行时运行相应的命令:

if myHashCommandTable.ContainsKey(myActionString)
{
    ((CommandHandler)myHashCommandTable[myActionString])
}

但是这会迫使我手工维护这个HashTable"并且很快就会成为开发人员的麻烦来源,并且应用程序不稳定!还有其他想法吗?

3 个答案:

答案 0 :(得分:1)

我想您可以在目标数据源中存储目标方法的名称,然后使用反射在运行时查找它。将数据传递给目标方法会很棘手,但这只是你要克服的一个令人激动的挑战!

答案 1 :(得分:1)

您可以允许模型同时包含操作名称和方法 - 有几种不同的方式。

<action name="issueThePurchaseOrder" run="PurchaseOrder.IssueThePurchaseOrder"/>

当您阅读文件时,请使用反射来查找运行命令,

或者在代码中将第二个表映射到“运行命令”到方法。

答案 2 :(得分:1)

与@ itsme86相似,真的 使用带有Reflection的Actionstring来查找表单上的方法。如果你想要更高级别的抽象,ActionString可以是一个属性值,你可以用它来装饰它的方法。

你可以添加一些测试代码来比较菜单项和操作,并查找元数据和实现之间的不匹配。