如何安全访问对象的属性

时间:2013-06-29 17:39:48

标签: c# winforms events dynamic reflection

我有一个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
    }
}

2 个答案:

答案 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时失败。