我(非常)是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"并且很快就会成为开发人员的麻烦来源,并且应用程序不稳定!还有其他想法吗?
答案 0 :(得分:1)
我想您可以在目标数据源中存储目标方法的名称,然后使用反射在运行时查找它。将数据传递给目标方法会很棘手,但这只是你要克服的一个令人激动的挑战!
答案 1 :(得分:1)
您可以允许模型同时包含操作名称和方法 - 有几种不同的方式。
<action name="issueThePurchaseOrder" run="PurchaseOrder.IssueThePurchaseOrder"/>
当您阅读文件时,请使用反射来查找运行命令,
或者在代码中将第二个表映射到“运行命令”到方法。
答案 2 :(得分:1)
与@ itsme86相似,真的 使用带有Reflection的Actionstring来查找表单上的方法。如果你想要更高级别的抽象,ActionString可以是一个属性值,你可以用它来装饰它的方法。
你可以添加一些测试代码来比较菜单项和操作,并查找元数据和实现之间的不匹配。