有了对属性的引用,有没有办法获取对包含对象的引用?

时间:2017-03-26 13:08:57

标签: c# object properties

我已将Label类扩展如下:

public class MyLabel: Label {
    public Button btn;
    public string mydata;
}

在我的主程序中,我实例化了一个新实例:

MyLabel lbl = new MyLabel();
lbl.mydata = "some data here";
lbl.btn = new Button();
lbl.btn.Click += new EventHandler(button_pressed);

this.Controls.Add(lbl); // Adds the label to the form
this.Controls.Add(lbl.btn); // Adds the button to the form

我创建了一个处理按钮点击事件的方法:

void button_pressed(Object sender, EventArgs e) {
     Button btn = (Button)sender;
     //Now I have an access to the property within MyLabel instance.
     // but how can I access the parent object?
     // I need to access the sibling property [mydata] string from here

     btn.Siblings["mydata"] = "some other thing" ;  //Something like this

     MyLabel lbl = btn.ParentObject();   //Or something like this
     lbl.mydata = "Some other thing";

}

3 个答案:

答案 0 :(得分:2)

这看起来像 WinForms ,在这种情况下, UserControl 或扩展Button类可能是一个好方法 - 只需保持对parent(使用 UserControl 稍微复杂一点,你需要在该控件上定义click事件,否则你会回到" square 1")I就像Tag属性解决方案一样,虽然有一个额外的强制转换,并且不保证类型安全(因为Tagobject,所以当你尝试时它可以是任何东西访问它)。

但是,让我们说你正在寻找更通用的解决方案;我们还要说有问题的课程是sealed,没有Tag或类似的目的属性,并且Controls集合不可用(或者循环使用它是不可取的出于性能原因)。据我所知,你无法确定父对象;但你可以很容易地提供自己的"控制"样式字典,将Button映射到父级:

public class MyLabel: Label {
    public static Dictionary<Button, MyLabel> ParentMap = new Dictionary<Button, MyLabel>();

    public Button btn;
    public string mydata;

    public void AddToParentMap() => ParentMap[btn] = this;
}

当您创建MyLabel的实例时,只需调用AddToParentMap()函数(无法在constructor中完成,因为this指针在创建对象之前不可用):

MyLabel lbl = new MyLabel();
lbl.AddToParentMap();

然后,您可以在点击活动中快速轻松地查找:

void button_pressed(Object sender, EventArgs e) {
    Button btn = (Button)sender;
    var label = MyLabel.ParentMap[btn];

    //...
    //Your code...
}

Tag解决方案不同,类型安全性得到保证 - 您始终知道您正在访问MyLabel对象。

答案 1 :(得分:0)

您无法通过按钮实例访问它,但您可以做的是从MyLabel集合获取Controls

var lbl = this.Controls.OfType<MyLabel>().FirstOrDefault(c => c.btn == btn);

答案 2 :(得分:0)

您可以使用Tag属性。

lbl.btn = new Button();
lbl.btn.Tag = lbl;

然后当你需要它时:

Button btn = (Button)sender;
Label lbl = (MyLabel)btn.Tag;