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

Nov*_*Eng 1 c# object-reference winforms

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

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

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

图1

图1

图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

}
Run Code Online (Sandbox Code Playgroud)

ric*_*hej 5

你忘了一些括号.你需要转换button.TagButtonMetaData.试试这个:

 Console.WriteLine(((ButtonMetaData)button.Tag).clickedByUser);
Run Code Online (Sandbox Code Playgroud)

如果没有括号您铸造button.Tag.clickedByUserButtonMetaData...