protected override Expression VisitParameter(ParameterExpression node)
        {
            object value;

            if (parameters.TryGetValue(node.Name, out value))
            {
                if (ReflectionHelper.IsInstanceOf(node.Type, value) || value == null)
                {
                    var createType = typeof(ObservableConstant <>).MakeGenericType(node.Type);
                    return((Expression)(ReflectionHelper.GetConstructor(createType).Invoke(new object[] { value })));
                }
                else
                {
                    var expression = value as Expression;
                    if (expression != null)
                    {
                        return(expression);
                    }
                    else
                    {
                        throw new InvalidOperationException(string.Format("The provided value {0} for parameter {1} is not valid.", value, node.Type));
                    }
                }
            }
            else
            {
                var createType = typeof(ObservableParameter <>).MakeGenericType(node.Type);
                return((Expression)(ReflectionHelper.GetConstructor(createType).Invoke(new object[] { node.Name })));
            }
        }