/// <summary>
        /// Converts to a <see cref="SqlParameter"/>.
        /// </summary>
        /// <param name="parameterDefinition">The parameter representation.</param>
        /// <returns>SqlParameter.</returns>
        public static SqlParameter ToSqlParameter(
            this ParameterDefinitionBase parameterDefinition)
        {
            parameterDefinition.MustForArg(nameof(parameterDefinition)).NotBeNull();

            if (parameterDefinition is InputParameterDefinition <byte[]> binaryRepresentationInput)
            {
                return(binaryRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <decimal> decimalRepresentationInput)
            {
                return(decimalRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <int> intRepresentationInput)
            {
                return(intRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <int?> intNullableRepresentationInput)
            {
                return(intNullableRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <long> longRepresentationInput)
            {
                return(longRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <long?> longNullableRepresentationInput)
            {
                return(longNullableRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <string> stringRepresentationInput)
            {
                return(stringRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <DateTime> dateTimeRepresentationInput)
            {
                return(dateTimeRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is InputParameterDefinition <DateTime?> dateTimeNullableRepresentationInput)
            {
                return(dateTimeNullableRepresentationInput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <byte[]> binaryRepresentationOutput)
            {
                return(binaryRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <decimal> decimalRepresentationOutput)
            {
                return(decimalRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <int> intRepresentationOutput)
            {
                return(intRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <int?> intNullableRepresentationOutput)
            {
                return(intNullableRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <long> longRepresentationOutput)
            {
                return(longRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <long?> longNullableRepresentationOutput)
            {
                return(longNullableRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <string> stringRepresentationOutput)
            {
                return(stringRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <DateTime> dateTimeRepresentationOutput)
            {
                return(dateTimeRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition is OutputParameterDefinition <DateTime?> dateTimeNullableRepresentationOutput)
            {
                return(dateTimeNullableRepresentationOutput.ToSqlParameter());
            }
            else if (parameterDefinition.GetType().GetGenericArguments().SingleOrDefault()?.IsEnum ?? false)
            {
                var genericDefinition = parameterDefinition.GetType().GetGenericTypeDefinition();
                if (genericDefinition == typeof(InputParameterDefinition <>))
                {
                    var enumValue = parameterDefinition.GetType()
                                    .GetProperty(nameof(InputParameterDefinition <string> .Value))
                                    ?.GetValue(parameterDefinition);
                    var stringParameter = new InputParameterDefinition <string>(parameterDefinition.Name, parameterDefinition.SqlDataType, enumValue?.ToString());
                    return(stringParameter.ToSqlParameter());
                }
                else if (genericDefinition == typeof(OutputParameterDefinition <>))
                {
                    var stringParameter = new OutputParameterDefinition <string>(parameterDefinition.Name, parameterDefinition.SqlDataType);
                    return(stringParameter.ToSqlParameter());
                }
                else
                {
                    throw new NotSupportedException(FormattableString.Invariant($"Param type {parameterDefinition.GetType().ToStringReadable()} is not supported."));
                }
            }
            else
            {
                throw new NotSupportedException(FormattableString.Invariant($"{nameof(ParameterDefinitionBase)} {nameof(parameterDefinition)} of type {parameterDefinition.GetType().ToStringReadable()} is not a supported type parameter."));
            }
        }