2016-10-17 7 views
1

У меня есть объект, который передается интерфейсу, я хотел бы, чтобы конкретное место за этим интерфейсом выполняло какое-то действие каждый раз, когда один из членов объекта меняет состояние. Другими словами, у меня есть некоторый объект, который содержит целое число. Когда значение этого целого изменяется, я хотел бы, чтобы мой конкретный класс сидел за этим интерфейсом, чтобы выполнить какую-то работу.Есть ли способ выполнить действие каждый раз, когда объект изменяется?

Теперь я мог бы сделать что-то вроде этого, имея поток, который сидит в состоянии wait и выполняет действие, как только pulse будет выполнен с использованием monitor. Но мне было интересно, имеет ли язык C# неотъемлемую поддержку такой вещи. Таким образом, когда элемент объекта изменяет состояние, действие будет выполнено автоматически. Я знаю, что это может быть невозможно, и если есть альтернативное решение, я бы хотел это услышать. Или, как нить, звучит как хорошая идея?

+0

Где вы хотите "выполнить действие"? Это из объекта-потребителя (тот объект, который получает экземпляр?). Если да, можете ли вы просто реализовать INotifyPropertyChanged в своем интерфейсе и ответить соответствующим образом? – RQDQ

+0

У вас есть две модели для работы с этим, нажимайте и тяните. В модели push, сам объект имеет поддержку для этого, обычно с помощью таких функций, как [INotifyPropertyChanged] (https://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged (v = vs. 110) .aspx). В модели на основе тяги вы должны постоянно контролировать объект и обнаруживать изменение снаружи. Просьба уточнить, поддерживает ли объект такие вещи или если вам нужно сидеть снаружи. Вы передаете объект через ссылку интерфейса или как ссылку на класс? –

+0

Это очень полезная информация, как относительно новый .NET-программист, о котором я не знал. И @RQDQ я хотел бы «выполнить некоторые действия» внутри моего конкретного класса. – Snoopy

ответ

2

Вы должны реализовать INotifyPropertyChanged, также наследовать свой интерфейс после INotifyPropertyChanged. Затем вводить свойства для всех состояний, связанных с правилами, и всегда в методах setter запускать событие PropertyChanged.

Для этого требуется некоторый код шаблона, но это очень надежное решение. Вы можете сделать свои свойства виртуальными и использовать контейнеры IoC, такие как Unity, для реализации шаблона для вас.

После выполнения операции вы просто подписаны на событие объекта PropertyChanged с помощью оператора + =.

myWatchedObject.ProperyChanged += listener.DependentObjectChangeHandler; 
+0

Чтобы решить вашу первую точку, объект, на который я обращаю внимание, уже имеет его элементы, реализованные как свойства. Итак, запуск события PropertyChanged внутри 'set' не должен иметь большого значения. – Snoopy

+0

Я предполагаю, что могу подписаться на это из моего конкретного (когда объект передается) и обрабатывать событие внутри конкретного. – Snoopy

+0

Чтобы обойти шаблон, попробуйте https://github.com/Fody/PropertyChanged –

2
  1. Инкапсулировать состояние объекта, используя свойство сеттера.
  2. Добавить код в свойство setter, чтобы поднять событие или вызвать метод.
0

Самый простой способ будет свойства:

class MyClass 
{ 
    private int _MyInteger; 
    public int MyInteger 
    { 
     get { return _MyInteger; } 
     set { _MyInteger = value; /* insert your "do some work" code here */ } 
    } 
} 
Смежные вопросы