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