コード例 #1
0
        internal ObservableMemberBinding <T> VisitMemberBinding <T>(MemberBinding memberBinding, INotifyExpression <T> target)
        {
            switch (memberBinding.BindingType)
            {
            case MemberBindingType.Assignment:
                var assignment = memberBinding as MemberAssignment;
                var property   = assignment.Member as PropertyInfo;
                if (property != null)
                {
                    var setter = ReflectionHelper.GetSetter(property);
                    if (setter != null)
                    {
                        return(memberBindingCreateProperty.MakeGenericMethod(typeof(T), property.PropertyType).Invoke(null, new object[] { memberBinding, this, target }) as ObservableMemberBinding <T>);
                    }
                }
                var field = assignment.Member as FieldInfo;
                if (field != null)
                {
                    return(Activator.CreateInstance(typeof(ObservablePropertyMemberBinding <,>).MakeGenericType(typeof(T), field.FieldType),
                                                    memberBinding, this, target, field) as ObservableMemberBinding <T>);
                }
                break;

            case MemberBindingType.ListBinding:
                break;

            case MemberBindingType.MemberBinding:
                break;

            default:
                break;
            }
            throw new NotSupportedException();
        }
コード例 #2
0
        private Expression VisitProperty(MemberExpression node, PropertyInfo property)
        {
            object getter;

            if (!ReflectionHelper.IsValueType(property.DeclaringType))
            {
                getter = ReflectionHelper.CreateDelegate(typeof(Func <,>).MakeGenericType(property.DeclaringType, property.PropertyType), ReflectionHelper.GetGetter(property));
            }
            else
            {
                //TODO: This is a bug in the BCL, code here to get out of this shit
                var param      = Expression.Parameter(property.DeclaringType);
                var expression = Expression.Lambda(Expression.Property(param, property), param);
                getter = expression.Compile();
            }
            if (property.CanWrite)
            {
                var setter = ReflectionHelper.GetSetter(property);
                if (setter != null)
                {
                    if (!ReflectionHelper.IsValueType(property.DeclaringType))
                    {
                        return(System.Activator.CreateInstance(typeof(ObservableReversableMemberExpression <,>).MakeGenericType(property.DeclaringType, property.PropertyType),
                                                               node, this, property.Name, getter, ReflectionHelper.CreateDelegate(typeof(Action <,>).MakeGenericType(property.DeclaringType, property.PropertyType), setter)) as Expression);
                    }
                    else
                    {
                        var setParam1     = Expression.Parameter(property.DeclaringType);
                        var setParam2     = Expression.Parameter(property.PropertyType);
                        var setExpression = Expression.Lambda(Expression.Assign(Expression.Property(setParam1, property), setParam2), setParam1, setParam2);

                        return(System.Activator.CreateInstance(typeof(ObservableReversableMemberExpression <,>).MakeGenericType(property.DeclaringType, property.PropertyType),
                                                               node, this, property.Name, getter, setExpression.Compile()) as Expression);
                    }
                }
            }
            return(System.Activator.CreateInstance(typeof(ObservableMemberExpression <,>).MakeGenericType(property.DeclaringType, property.PropertyType),
                                                   node, this, property.Name, getter) as Expression);
        }
コード例 #3
0
        private static ObservableMemberBinding <T> CreateProperty <T, TMember>(MemberAssignment node, ObservableExpressionBinder binder, INotifyExpression <T> target)
        {
            INotifyExpression <TMember> value = binder.VisitObservable <TMember>(node.Expression);
            var property   = node.Member as PropertyInfo;
            var reversable = value as INotifyReversableExpression <TMember>;

            if (reversable != null && ReflectionHelper.IsAssignableFrom(typeof(INotifyPropertyChanged), typeof(T)))
            {
                return(new ObservableReversablePropertyMemberBinding <T, TMember>(target, node.Member.Name,
                                                                                  ReflectionHelper.CreateDelegate(typeof(Func <T, TMember>), ReflectionHelper.GetGetter(property)) as Func <T, TMember>,
                                                                                  ReflectionHelper.CreateDelegate(typeof(Action <T, TMember>), ReflectionHelper.GetSetter(property)) as Action <T, TMember>,
                                                                                  reversable));
            }
            return(new ObservablePropertyMemberBinding <T, TMember>(target,
                                                                    ReflectionHelper.CreateDelegate(typeof(Action <T, TMember>), ReflectionHelper.GetSetter(property)) as Action <T, TMember>, value));
        }