Динамический поиск состояния объекта / Методы - PullRequest
0 голосов
/ 29 мая 2011

Есть ли в любом случае создать динамически извлекаемый метод, который каким-то образом отслеживает состояние объекта, но должен вызываться только один раз и обновит свой результат, как только состояние объекта, которое он наблюдает, было изменено или изменено каким-либо образом, который не был ' 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 голосов
/ 29 мая 2011

Это дорого, с точки зрения производительности и не совсем в режиме реального времени, но вы можете достичь желаемого с помощью Reactive Extensions.

Посмотрите примеры здесь:

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

В частности, вам будет интересно создать Observable.Sample или Observable.Interval.

Помимо этого, вы можете пойти по пути генерации прокси ... но это включаетбольше контроля над фактическими типами, которые вы хотите наблюдать.Если вы управляете определением типа, вы можете объявить все свои свойства как виртуальные и создавать экземпляры вашего типа, используя динамические прокси (Castle Windsor / DynamicProxy - это один из инструментов, хотя есть и другие).Вы можете автоматически заставить свой тип реализовать INotifyPropertyChanged

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

и просто привязать обработчик события, чтобы наблюдать событие PropertyChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...