Exemple #1
0
        private void Subscribe()
        {
            INotifyPropertyChanged subject = this.Subject;

            if (subject == null)
            {
                return;
            }

            for (int i = 0; i < this.AccessNode.Children.Count; i++)
            {
                PropertyAccessNode propertyNode = (PropertyAccessNode)this.AccessNode.Children[i];

                WeakPropertyChangedEventManager.Register(
                    subject,
                    propertyNode.Property.Name,
                    this,
                    (me, sender, args) => me.OnPropertyChanged(sender, args));
            }

            if (this.Children != null)
            {
                for (int i = 0; i < this.Children.Count; i++)
                {
                    this.Children[i].UpdateSubject(subject);
                }
            }
        }
                public SubscriptionNode(
                    Action <TListener, object> subscriberCallback,
                    PropertyAccessNode propertyAccessNode)
                {
                    _children           = new List <SubscriptionNode>();
                    _subscriberCallback = subscriberCallback;
                    _propertyAccessNode = propertyAccessNode;

                    _onChangedCallback  = OnPropertyChanged;
                    _onChangingCallback = OnPropertyChanging;

                    BuildChildren();
                }
Exemple #3
0
        private void Unsubscribe()
        {
            INotifyPropertyChanged subject = this.Subject;

            if (subject == null)
            {
                return;
            }

            for (int i = 0; i < this.AccessNode.Children.Count; i++)
            {
                PropertyAccessNode propertyNode = (PropertyAccessNode)this.AccessNode.Children[i];

                WeakPropertyChangedEventManager.Unregister(subject, propertyNode.Property.Name, this, null);
            }

            if (this.Children != null)
            {
                for (int i = 0; i < this.Children.Count; i++)
                {
                    this.Children[i].Unsubscribe();
                }
            }
        }
Exemple #4
0
        private static void BuildBranches(Expression expression, PropertyAccessTree tree, Stack <PropertyAccessTreeNode> currentNodeBranch, Predicate <Type> typeFilter)
        {
            BinaryExpression binaryExpression = expression as BinaryExpression;

            if (binaryExpression != null)
            {
                BuildBranches(binaryExpression.Left, tree, currentNodeBranch, typeFilter);
                BuildBranches(binaryExpression.Right, tree, currentNodeBranch, typeFilter);
                return;
            }

            UnaryExpression unaryExpression = expression as UnaryExpression;

            if (unaryExpression != null)
            {
                BuildBranches(unaryExpression.Operand, tree, currentNodeBranch, typeFilter);
                return;
            }

            MethodCallExpression methodCallExpression = expression as MethodCallExpression;

            if (methodCallExpression != null)
            {
                foreach (Expression argument in methodCallExpression.Arguments)
                {
                    BuildBranches(argument, tree, currentNodeBranch, typeFilter);
                }
                return;
            }

            ConditionalExpression conditionalExpression = expression as ConditionalExpression;

            if (conditionalExpression != null)
            {
                BuildBranches(conditionalExpression.Test, tree, currentNodeBranch, typeFilter);
                BuildBranches(conditionalExpression.IfTrue, tree, currentNodeBranch, typeFilter);
                BuildBranches(conditionalExpression.IfFalse, tree, currentNodeBranch, typeFilter);
                return;
            }

            InvocationExpression invocationExpression = expression as InvocationExpression;

            if (invocationExpression != null)
            {
                foreach (Expression argument in invocationExpression.Arguments)
                {
                    BuildBranches(argument, tree, currentNodeBranch, typeFilter);
                }
                BuildBranches(invocationExpression.Expression, tree, currentNodeBranch, typeFilter);
                return;
            }

            switch (expression.NodeType)
            {
            case ExpressionType.MemberAccess:
                MemberExpression memberExpression = (MemberExpression)expression;

                PropertyInfo property  = memberExpression.Member as PropertyInfo;
                FieldInfo    fieldInfo = memberExpression.Member as FieldInfo;
                if (property != null)
                {
                    PropertyAccessNode node = new PropertyAccessNode(property);
                    currentNodeBranch.Push(node);

                    BuildBranches(memberExpression.Expression, tree, currentNodeBranch, typeFilter);
                }
                else if (fieldInfo != null)
                {
                    if (typeFilter(fieldInfo.FieldType))
                    {
                        ConstantExpression constantExpression = (ConstantExpression)memberExpression.Expression;
                        if (constantExpression.Value != null)
                        {
                            object       value        = fieldInfo.GetValue(constantExpression.Value);
                            ConstantNode constantNode = new ConstantNode((INotifyPropertyChanged)value);
                            currentNodeBranch.Push(constantNode);
                            AddBranch(tree, currentNodeBranch);
                        }
                    }
                    else
                    {
                        currentNodeBranch.Clear();
                    }
                }
                else
                {
                    BuildBranches(memberExpression.Expression, tree, currentNodeBranch, typeFilter);
                }

                break;

            case ExpressionType.Parameter:
                ParameterExpression parameterExpression = (ParameterExpression)expression;
                ParameterNode       parameterNode       = new ParameterNode(expression.Type, parameterExpression.Name);
                currentNodeBranch.Push(parameterNode);
                AddBranch(tree, currentNodeBranch);
                break;

            case ExpressionType.Constant:
            {
                ConstantExpression constantExpression = (ConstantExpression)expression;
                if (typeFilter(constantExpression.Type) &&
                    constantExpression.Value != null)
                {
                    ConstantNode constantNode = new ConstantNode((INotifyPropertyChanged)constantExpression.Value);
                    currentNodeBranch.Push(constantNode);
                    AddBranch(tree, currentNodeBranch);
                }
                else
                {
                    currentNodeBranch.Clear();
                }
            }
            break;

            case ExpressionType.New:
            {
                NewExpression newExpression = (NewExpression)expression;
                foreach (Expression argument in newExpression.Arguments)
                {
                    BuildBranches(argument, tree, currentNodeBranch, typeFilter);
                }
            }
            break;

            case ExpressionType.MemberInit:
            {
                MemberInitExpression memberInitExpression = (MemberInitExpression)expression;
                BuildBranches(memberInitExpression.NewExpression, tree, currentNodeBranch, typeFilter);
                foreach (var memberBinding in memberInitExpression.Bindings)
                {
                    MemberAssignment assignment = memberBinding as MemberAssignment;
                    if (assignment != null)
                    {
                        BuildBranches(assignment.Expression, tree, currentNodeBranch, typeFilter);
                    }
                }
            }
            break;

            default:
                throw new InvalidProgramException(string.Format("CLINQ does not support expressions of type: {0}", expression.NodeType));
            }
        }