2

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

然后我可以使用这个“菜单”数据源在运行时构建和显示表单的特定 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,它很快就会成为开发人员的麻烦源,以及应用程序的不稳定!还有什么想法吗?

4

3 回答 3

1

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

于 2012-05-15T15:16:42.177 回答
1

您可以允许模型同时保存动作名称和方法 - 有几种不同的方式。

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

当你阅读文件时,要么使用反射来找到你的运行命令,

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

于 2012-05-15T15:18:47.480 回答
1

与@itsme86 类似,真正使用Actionstring with Reflection 来查找表单上的方法。如果你想要更高层次的抽象 ActionString 可以是一个属性值,你可以用它来装饰它执行的方法。

两者的一个很好的结果是您可以添加一些测试代码来比较菜单项和操作,并查找元数据和实现之间的不匹配。

于 2012-05-15T15:21:50.037 回答