为什么我不能直接访问已分配给 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
...
我想用我的自定义对象 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
...