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);
        }
Esempio n. 3
0
 /// <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)));
 }