我有一个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
}
}
答案 0 :(得分:2)
您可以将强制类型转换为所有控件的父类型,而不是特定子级。
Control ctrl = sender as Control;
if (ctrl != null)
MessageBox.Show(ctrl.Tag.ToString());
答案 1 :(得分:1)
如果你正在听的东西总是有.Tag
,那么你也可以选择鸭子型:
dynamic ctrl = sender;
object tag = ctrl.Tag;
使用反射(就像在问题中一样)会在使用dynamic
时失败。