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

ターゲットメソッドの名前をデータソースに保存し、リフレクションを使用して実行時に検索することができると思います。ターゲットメソッドにデータを渡すのは難しいですが、それはあなたが克服するためのもう1つのエキサイティングな課題です!

于 2012-05-15T15:16:42.177 に答える
1

モデルがアクション名とメソッドの両方を保持できるようにすることができます-いくつかの異なる方法。

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

ファイルを読み取るときは、リフレクションを使用して実行コマンドを見つけます。

または、「コマンドの実行」をメソッドにマッピングするコードに2番目のテーブルがあります。

于 2012-05-15T15:18:47.480 に答える
1

@ itsme86と同様に、実際にはActionstring with Reflectionを使用して、フォーム上のメソッドを検索します。より高いレベルの抽象化が必要な場合は、ActionStringを属性値にすることができ、それを使用して実行するメソッドを装飾することができます。

どちらからも、メニュー項目とアクションを比較するためのテストコードを少し追加して、メタデータと実装の間の不一致を探すことができます。

于 2012-05-15T15:21:50.037 に答える