2016-02-24 35 views
0

我目前正在编写一个应用程序,我在其中反序列化相对较大的对象(它也可以增长的大小,取决于用户添加到他们)。我不想将所有这些内容加载到RAM中,因为当它们中有很多时它们可能会导致问题。订阅事件处理程序引用是NULL

无论如何,我想处理由该类的已加载实例引发的事件,如果有已经是我的问题的事件。

我该如何订阅一个事件处理程序到一个仍然为空的对象?

我觉得像“如果有一个对象,它引发该事件处理它的方法”。



下面是一些示例代码,我能想到的,虽然我已经想到它不能正常工作的唯一方法..

public class MyClassA 
{ 
    public event EventHandler PropertyChanged; 

    private string someProperty 
    public string SomeProperty 
    { 
     set 
     { 
      someProperty = value; 
      PropertyChanged?.Invoke(this, EventArgs.Empty); 
     } 
    } 

    public static MyClassA Load(string path) 
    { 
     /*...*/ 
    } 
} 

public class MyClassB 
{ 
    public MyClassA InstanceOfA { get; private set; }   

    public MyClassB 
    { 
     //InstanceOfA.PropertyChanged += MyEventHandler; Not working, NullReference 
    } 

    // Handle InstanceOfA.PropertyChanged here... 
    public void MyEventHandler(object sender, EventArgs e)   
    { 
     /*...*/ 
    } 
} 

+0

“?我怎么可以订阅一个事件处理程序的对象仍然是空” - 你不能。 – Enigmativity

回答

2

当然,你可以不订阅一个事件处理程序给一个仍然为空的对象,但是当你为它指定一个非空值时,你可以订阅它。
只需使用属性和支持字段:

public class MyClassB 
{ 
    private MyClassA myVar; 

    public MyClassA InstanceOfA 
    { 
     get { return myVar; } 
     private set 
     { 
      myVar = value; 
      if (myVar != null) 
       myVar.PropertyChanged += MyEventHandler; 
     } 
    } 

    public void MyEventHandler(object sender, EventArgs e) 
    { 

    } 
} 
+0

谢谢:)现在我明白了,这似乎很明显。 – Stefan

相关问题