public static void Validate <T>(this T value, [InvokerParameterName][NotNull] string argumentName, EnumIs validationType) where T : struct { switch (validationType) { case EnumIs.Member: case EnumIs.NonZeroMember: var enumType = typeof(T); if (!enumType.IsEnum) { throw new ArgumentOutOfRangeException(nameof(value), value, $@"'{nameof(value)}' is not an enum type."); } if (!Enum.IsDefined(enumType, value)) { throw new ArgumentOutOfRangeException(argumentName, value, $@"'{argumentName}' is not a valid member of the [{enumType.FullName}] type."); } if (validationType == EnumIs.NonZeroMember) { if (value is Enum) { var type = Enum.GetUnderlyingType(typeof(T)); var integerValue = System.Convert.ChangeType(value, type); var e = System.Convert.ToInt64(integerValue); if (e.Equals(0)) { throw new ArgumentOutOfRangeException(argumentName, value, $@"'{argumentName}' is set to 'Unknown'."); } } } break; default: throw new ArgumentOutOfRangeException(nameof(validationType), validationType, $@"'{nameof(validationType)}' is not a valid member of the [{ErrorMessages.GetRepresentation(typeof(EnumIs))}] type."); } }
public static void Validate <TEnum>(this TEnum argumentValue, [NotNull][InvokerParameterName] string argumentName, EnumIs validation) where TEnum : struct { var type = typeof(TEnum); if (!type.IsEnum) { throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Exceptions.Validate_EnumValueNotEnum, nameof(argumentValue)), nameof(argumentValue)); } if (validation == EnumIs.None) { return; } if (!Enum.IsDefined(typeof(EnumIs), validation)) { throw new ArgumentOutOfRangeException(nameof(validation), validation, string.Format(CultureInfo.CurrentCulture, Exceptions.Validate_ValidationKindWrong, nameof(validation), nameof(EnumIs))); } if (validation.HasFlag(EnumIs.ValidMember) && !Enum.IsDefined(type, argumentValue)) { throw new ArgumentOutOfRangeException(nameof(validation), validation, string.Format(CultureInfo.CurrentCulture, Exceptions.Validate_EnumValueNotMember, argumentName, type.Namespace, type.Name)); } if (validation.HasFlag(EnumIs.NonZero)) { var value = Convert.ToInt32(argumentValue, CultureInfo.InvariantCulture); if (value == 0) { throw new ArgumentOutOfRangeException(nameof(validation), validation, string.Format(CultureInfo.CurrentCulture, Exceptions.Validate_ValueZero, argumentName)); } } Contract.EndContractBlock(); }