protected override Expression VisitDefault(DefaultExpression node) { object defaultValue; if (!ReflectionHelper.IsValueType(node.Type)) { defaultValue = null; } else { defaultValue = Activator.CreateInstance(node.Type); } return(Activator.CreateInstance(typeof(ObservableConstant <>).MakeGenericType(node.Type), defaultValue) as Expression); }
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); }
/// <summary> /// Incrementally tests whether the given incremental value is an instance of the given type /// </summary> /// <param name="inner">The value that should be tested for the given type</param> /// <param name="type">The type for which should be tested</param> /// <returns>An incremental value whether the object is of the given type</returns> public static INotifyExpression <bool> InstanceIOf(INotifyExpression <object> inner, Type type) { return(new ObservableTypeExpression(inner, type, ReflectionHelper.IsValueType(type))); }