private void SubscribeListeners(Expression propertyExpression) { var propNameStack = new Stack <PropertyInfo>(); while (propertyExpression is MemberExpression temp) // Gets the root of the property chain. { propertyExpression = temp.Expression; propNameStack.Push(temp.Member as PropertyInfo); // Records the member info as property info } if (!(propertyExpression is ConstantExpression constantExpression)) { throw new NotSupportedException("Operation not supported for the given expression type. " + "Only MemberExpression and ConstantExpression are currently supported."); } var propObserverNodeRoot = new PropertyObserverNode(propNameStack.Pop(), _action); PropertyObserverNode previousNode = propObserverNodeRoot; foreach (var propName in propNameStack) // Create a node chain that corresponds to the property chain. { var currentNode = new PropertyObserverNode(propName, _action); previousNode.Next = currentNode; previousNode = currentNode; } object propOwnerObject = constantExpression.Value; if (!(propOwnerObject is INotifyPropertyChanged inpcObject)) { throw new InvalidOperationException("Trying to subscribe PropertyChanged listener in object that " + $"owns '{propObserverNodeRoot.PropertyInfo.Name}' property, but the object does not implements INotifyPropertyChanged."); } propObserverNodeRoot.SubscribeListenerFor(inpcObject); }
private void Start() { PropertyObserverNode.Observes(_propertyExpression, _action, this); }