/// <summary>
        /// Creates an <see cref="Argument{T}"/> for validating an argument value.
        /// </summary>
        /// <typeparam name="TPrevious">The previous argument type.</typeparam>
        /// <typeparam name="T">The argument type.</typeparam>
        /// <param name="argument">A wrapper object containing the previous argument value.</param>
        /// <param name="parameter">The parameter.</param>
        /// <returns>A wrapper object containing the actual argument value.</returns>
        /// <exception cref="ArgumentNullException"><paramref name="parameter"/> is null.</exception>
        /// <exception cref="ArgumentException"><paramref name="parameter"/> does not select a parameter.</exception>
        public static IArgument <TPrevious> That <TPrevious, T>(this IValidatedArgument <T> argument, Expression <Func <TPrevious> > parameter)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException(ParameterNames.Parameter);
            }

            var memberExpression = parameter.Body as MemberExpression;

            if (memberExpression == null)
            {
                throw new ArgumentException(Messages.MustSelectParameter, ParameterNames.Parameter);
            }

            var constantExpression = memberExpression.Expression as ConstantExpression;

            if (constantExpression == null)
            {
                throw new ArgumentException(Messages.MustSelectParameter, ParameterNames.Parameter);
            }

            var parameterName = memberExpression.Member.Name;

            var type  = constantExpression.Value.GetType();
            var field = type.GetField(parameterName);

            var value = (TPrevious)field.GetValue(constantExpression.Value);

            return(new Argument <TPrevious>(value, parameterName));
        }
 public static IArgument <TPrevious> That <TPrevious, T>(this IValidatedArgument <T> argument, TPrevious value, string parameterName)
 {
     return(new Argument <TPrevious>(value, parameterName));
 }