protected override Expression VisitMember(MemberExpression node) { var property = node.Member as PropertyInfo; if (property != null) { if (ReflectionHelper.GetGetter(property).IsStatic) { return(VisitConstant(Expression.Constant(property.GetValue(null, null), property.PropertyType))); } return(VisitProperty(node, property)); } var field = node.Member as FieldInfo; if (field != null) { if (field.IsStatic) { return(VisitConstant(Expression.Constant(field.GetValue(null), field.FieldType))); } return(VisitField(node, field)); } 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)); }