从c#中的实例变量获取对象引用?

时间:2013-03-11 20:53:17

标签: c# wpf

我是WPF应用程序的新手,也是c#的新手。我会解释一下我的情况:

我有一个名为myObject的类,它有一个Image类型的图像实例变量 在运行时,我想得到image的对象引用,如:

myObject obj = new myObject();

Image img = obj.getImage();//reference to obj's image variable;

现在来自img我希望获得对象obj的参考。我怎么得到这个?

编辑:以下是解决方案。

专家!首先,谢谢你们所有的帮助!我真的很感激!你们全都摇滚!

按照 Noob.net 的建议,每当我创建myObject obj时,我都会将obj引用存储在 img.Tag 属性中!

myObject obj = new myObject();
img.MouseLeftButtonDown += new MouseButtonEventHandler(img_MouseLeftButtonDown);
Image img = obj.getImage();

处理程序部分:

Image i = (Image)sender;
myObject otemp = (myObject)i.Tag;// refers to the same object from which img was created

5 个答案:

答案 0 :(得分:2)

您可以直接执行此操作的唯一方法是,如果您的Image类型具有对其所有者对象的引用。如果你在谈论.NET内置的Image类型,那么就没有这样的属性。

您必须采取措施将每个Image的父对象记录在以后可以返回的其他位置。一种常见的模式是在内存中维护HashTable,其中Image对象是键,MyObject对象是值。

答案 1 :(得分:2)

如果您按照建议将ImagemyObject放在一起Dictionary,那么您将度过一段美好时光。您的图像将与字典一样长,并且可能不会及时处理。

那么为什么在构建数据以默认跟踪引用时使用数据结构跟踪此映射?

如果你在View Model包装地图,你就会明白我的意思:

public class MyObjectViewModel : INotifyPropertyChanged
{
    private myObject obj;

    public Image Image
    {
        get;
        private set;
    }

    public MyObjectViewModel(myObject obj)
    {
        this.obj = obj;
        this.Image = obj.getImage();
    }

    public void SomethingThatMakesImageChange()
    {
        this.Image = obj.getImage();
        this.RaisePropertyChanged("Image");
    }

    // ... insert suitable INPC implementation ...
}

这种方法有两个明显的优点:

  1. 您的视图模型通常只会在您的模型执行时生效,这意味着繁重的Image类只会在视图中生存所需的时间
  2. 如果您需要适应myObject个实例的实时更改,您可以使用视图模型相应地处理这些更改和Image的更新。

答案 2 :(得分:2)

您可以使用Tag属性存储有关Image实例的其他信息

答案 3 :(得分:0)

您的Image类必须拥有一个Parent属性,该属性包含对myObject实例的引用。然后,您必须确保在myObject上设置图像时设置Parent属性。

现在,如果您不能或不会向Parent类添加Image属性,那么您唯一的选择就是将myObject的实例与{{ 1}}查看Image是否包含它。如果你有一个myObject的集合,那么对于Linq来说这很容易,但性能可能不是很好。

答案 4 :(得分:0)

我想我不明白,但这里是我的回答:

public class MyObject
{
    private Image img;
    public Image Img
    {
        get { return img; }
        set { img = value; }
    }
    public MyObject()
    {
        Img = Image.FromFile("");
    }
}

public class Main
{
    MyObject obj = new MyObject();
    //obj.Img = Image.FromFile(""); //if u want
    Image image = obj.Img;
}