C# 是否存在一种类型的对象,我可以向其强制转换按钮和菜单项对象以访问其标记属性?

C# 是否存在一种类型的对象,我可以向其强制转换按钮和菜单项对象以访问其标记属性?,c#,.net,casting,C#,.net,Casting,我想将MenuItem对象和Button控件对象强制转换为可以引用其“Tag”属性的对象类型 有这样的对象类型吗 例如 但此操作失败-“无法将对象类型“System.Windows.Forms.MenuItem”强制转换为类型“System.Windows.Forms.Control” 在本例中,什么可以取代控件?控件是您要寻找的。控件是您要寻找的。菜单项和按钮的继承路径不同,没有共享/继承的标记属性 MenuItem继承自声明标记属性的菜单,Button继承自也实现标记属性的控件。您应该能够将

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

有这样的对象类型吗

例如

但此操作失败-“无法将对象类型“System.Windows.Forms.MenuItem”强制转换为类型“System.Windows.Forms.Control”


在本例中,什么可以取代控件?

控件是您要寻找的。

控件是您要寻找的。

菜单项和按钮的继承路径不同,没有共享/继承的标记属性

MenuItem继承自声明标记属性的菜单,Button继承自也实现标记属性的控件。您应该能够将MenuItem和Button强制转换为组件,但这对您没有帮助,因为标记属性是在我提到的派生类(菜单和控件)中声明的


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

对于MenuItem和Button,继承路径不同,没有共享/继承的标记属性

MenuItem继承自声明标记属性的菜单,Button继承自也实现标记属性的控件。您应该能够将MenuItem和Button强制转换为组件,但这对您没有帮助,因为标记属性是在我提到的派生类(菜单和控件)中声明的


在这种特殊情况下,您可能需要使用反射而不是继承。或者提出方案B

我在没有IDE的情况下写这篇文章


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

我写这个没有IDE


object myControlOrMenu = sender as MenuItem ?? sender as Button;
if (myControlOrMenu == null)
// neither of button or menuitem
使用“as”操作符。

使用“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 
}