2011-05-29 52 views
0

有无论如何创建一个动态检索的方法,它以某种方式监视一个对象的状态,但只需要调用一次,并将更新其结果,一旦它观察的对象的状态已被修改或以某种方式改变,这不等于该方法被调用之前的状态。对象的状态/方法的动态检索

我有一个脚本这里说明我的观点:

bool isNull = false; 

    Object obj = new Object(); 

    isNull = (bool)obj.ExtNull(); 

    string reply = TestMethodA(isNull); 

    Console.WriteLine("Is object null? Answer: {0}. State of isNull: {1}", reply, isNull); 

    obj = null; 

    Console.WriteLine("\n\nNulling object... "); 
    Console.WriteLine("\n\nNew answer: "); 
    Console.WriteLine("\n\nIs object null? Answer: {0}. State of isNull: {1}", reply, isNull); 

    Console.Read(); 
} 

public static string TestMethodA(bool isNull) 
{ 
    string str; 

    if (isNull) 
     str = "yes"; 
    else 
     str = "no"; 

    return str; 

} 

我们可以看到,一个对象调用铸成一个布尔值,它满足了方法的返回类型的扩展方法。然后将该语句分配给bool isNull变量。

然后调用一个字符串,并分配TestMethodA,它将isNull作为其参数。一旦在方法的参数中接收到isNull,它将分析布尔值是true还是false。如果它是真的(意思是该对象为空),则在该方法内调用的字符串变量的值为“是”。同样,如果不是,它将采取“不”。

该字符串然后返回,并传回给该方法。字符串和布尔值都在Console.WriteLine方法中发布。

发生这种情况后,obj引用变量将自身赋值为null,失去曾经引用的值。

WriteLine语句然后发布与之前相同的语句,分析对象的布尔值和状态。当然,尽管对象的状态现在为空,但是由于C#并没有真正的指针(真正的耻辱,真的,现在我想到了它)而没有不安全的代码,有没有什么办法实现这个动态?

回答

0

这是昂贵的,性能明智的,它不是完全实时的,但你可能能够使用反应性扩展完成你想要的。

退房这里的例子:

http://rxwiki.wikidot.com/101samples#toc1

具体来说,你对创建一个Observable.SampleObservable.Interval

除此之外,你可以去代理生成的路线......但涉及更多的控制你想观察的实际类型。如果您控制了类型定义,则可以将所有属性声明为虚拟,并使用动态代理创建类型的实例(Castle Windsor/DynamicProxy是执行此操作的一种工具,但也有其他工具)。你可以自动让你的类型,执行INotifyPropertyChanged

http://www.codewrecks.com/blog/index.php/2008/08/04/implement-inotifypropertychanged-with-castledynamicproxy/

,只需绑定一个事件处理看PropertyChanged事件。

+0

太棒了。谢谢。 – zeboidlund 2011-05-29 04:52:24