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

您可以将 is 作为所有控件的父类型而不是特定子类型。

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 回答