2

同じハンドラーにマップされるいくつかのメニュー項目コマンドを含む WinForms アプリがあります。メニュー項目のTagプロパティを使用して、ハンドラーがどのように動作するかを識別します。

問題は、ハンドラーのsenderパラメーターの型がobject. Tagでは、オブジェクトのプロパティを読み取るにはどうすればよいでしょうか。

メニュー項目の型に型キャストできることはわかってsenderいますが、ボタンやその他のコントロールを同じハンドラーにマップしたい場合はどうすればよいでしょうか? Tag送信者であるオブジェクトからプロパティを読み取る一般的な方法はありますか?

これが私がこれまでに持っているものです。うまくいくようです。しかし、もっと合理的な方法はありませんか?

private void Header_Click(object sender, EventArgs e)
{
    dynamic ctrl = sender as dynamic;
    if (ctrl != null && sender.GetType().GetProperty("Tag") != null)
    {
        // Go ahead and reference ctrl.Tag
    }
}
4

2 に答える 2

2

特定の子ではなく、すべてのコントロールの親タイプとしてキャストできます。

Control ctrl = sender as Control;
if (ctrl != null)
    MessageBox.Show(ctrl.Tag.ToString());
于 2013-06-29T17:43:34.623 に答える
1

聞いているものに常に が含まれて.Tagいる場合は、ダックタイプを使用することもできます。

dynamic ctrl = sender;
object tag = ctrl.Tag;

(質問のように)リフレクションを使用すると、 を使用する際のポイントが無効になりdynamicます。

于 2013-06-29T18:19:07.573 に答える