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(); }
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); }
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)); }