为什么我不能直接访问已分配给 WinForms Control.Tag 属性 的自定义对象的属性?

Why can't I directly access the properties of a custom object that I've assigned to a WinForms Control.Tag property?

我想用我的自定义对象 ButtonMetaData 设置 Winforms Control.Tag 属性,然后使用 Control.Tag 属性。应该可以工作,因为 Tag 属性 被定义为一个对象,对吧?见图 1。

但是,为了访问 ButtonMetaData 的属性,我不得不按顺序将 Tag 对象分配给中间对象变量(x 在我的示例中)访问 ButtonMetaData 属性。当我尝试使用已强制转换为 ButtonMetaData 的 Tag 对象访问它们时,编译器会报错。见图 2。

为什么我不能使用已转换为 ButtonMetaData 的 Tag 对象直接访问 ButtonMetaData 的属性?

图一

图2

public class ButtonMetaData
{
    public bool clickedByUser;
    public bool clickedProgramatically;

    public ButtonMetaData(bool clickedByUser, bool clickedProgramatically)
    {
        this.clickedByUser = clickedByUser;
        this.clickedProgramatically = clickedProgramatically;
    }
}

private void Button1_Click(object sender, EventArgs e)
{
    Button button = (Button)sender;

    button.Tag = new ButtonMetaData(clickedByUser: true, clickedProgramatically: false);

    //BUILDS OK
    ButtonMetaData x = (ButtonMetaData)button.Tag;
    Console.WriteLine(x.clickedByUser);
    Console.WriteLine(x.clickedProgramatically);
    //BUILDS OK

    //DOESN'T BUILD - error on field clickedByUser and error on field clickedProgramatically
    Console.WriteLine((ButtonMetaData)button.Tag.clickedByUser);
    Console.WriteLine((ButtonMetaData)button.Tag.clickedProgramatically);
    //DOESN'T BUILD - error on field clickedByUser and error on field clickedProgramatically

}

您忘记了一些括号。您需要将 button.Tag 转换为 ButtonMetaData。试试这个:

 Console.WriteLine(((ButtonMetaData)button.Tag).clickedByUser);

如果没有括号,您会将 button.Tag.clickedByUser 转换为 ButtonMetaData...