1

我想将 MenuItem 对象和 Button 控件对象都转换为我可以引用其“Tag”属性的对象类型。

有这样的对象类型吗?

例如

void itemClick(object sender, EventArgs e)
{
    Control c = (Control)sender;
    MethodInvoker method = new MethodInvoker(c.Tag.ToString(), "Execute");
    method.Invoke();
}

除了这失败 - “无法将对象类型'System.Windows.Forms.MenuItem'转换为'System.Windows.Forms.Control'

在这个例子中什么可以代替 Control?

4

4 回答 4

2

我在没有 IDE 的情况下写这个。


object myControlOrMenu = sender as MenuItem ?? sender as Button;
if (myControlOrMenu == null)
// neither of button or menuitem

于 2008-11-27T05:35:10.920 回答
2

使用“as”运算符。

object tag;
Button button;
MenuItem menuItem = sender as MenuItem;
if (menuItem  != null)
{
    tag = menuItem.Tag;
}
else if( (button = sender as Button) != null )
{
    tag = button.Tag;
} 
else 
{
    //not button nor MenuItem 
}

于 2008-11-27T05:43:01.933 回答
1

MenuItem 和 Button 的继承路径不同,没有共享/继承的 Tag 属性。

MenuItem 继承自 Menu ,它声明了一个 Tag 属性,Button 继承自 Control ,它也实现了一个 Tag 属性。您应该能够将 MenuItem 和 Button 都转换为 Component,但这对您没有帮助,因为 Tag 属性是在我提到的派生类(菜单和控件)中声明的。

在这种特定情况下,您可能需要使用反射而不是继承。或者想出B计划

于 2008-11-27T05:31:23.613 回答
0

控制就是您要寻找的。

于 2008-11-27T05:15:49.667 回答