对象状态/方法的动态检索

时间:2011-05-29 01:30:38

标签: c# object dynamic state

无论如何都要创建一个动态可检索的方法,它以某种方式监视一个对象的状态,但只需要调用一次,并且一旦它观察到的对象的状态被某种方式修改或改变就会更新它的结果。 t等于调用方法时的状态。

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

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,它满足方法的返回类型。然后将此语句分配给bool isNull变量。

然后调用一个字符串,并指定TestMethodA,它将isNull作为参数传递。一旦在方法的参数中接收到isNull,它就会分析布尔值是真还是假。如果它是真的(意味着对象为null),则在方法中调用的字符串变量对其值采用“是”。同样,如果没有,则需要“否”。

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

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

WriteLine语句然后发布它之前的相同语句,分析布尔值和对象的状态。当然,尽管对象的状态现在为空,

所以,既然C#没有真正的指针(真的很遗憾,真的,现在我考虑一下)没有不安全的代码,有没有办法动态实现这个?

1 个答案:

答案 0 :(得分:0)

这是昂贵的,性能明智的,并不是完全实时的,但您可以使用Reactive Extensions完成您想要的任务。

查看以下示例:

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事件。