/// <summary>
 /// 设置默认的校验规则
 /// </summary>
 /// <param name="vatLength">默认校验实现对应的编号长度</param>
 /// <param name="validator">默认实现</param>
 public static void SetValidator(int vatLength, IVATCodeValidator <VATCodeValidationResult> validator)
 {
     if (validator == null)
     {
         throw new ArgumentNullException(nameof(validator));
     }
     concurrentDictionary.AddOrUpdate(vatLength, k => validator, (k, a) => validator);
 }
        /// <summary>
        /// 验证当前增值税发票代码是否正确
        /// </summary>
        /// <param name="vatCode">发票代码</param>
        /// <param name="kind">发票类型</param>
        /// <param name="length">发票长度</param>
        /// <param name="minYear">最小年份</param>
        /// <returns></returns>
        public static VATCodeValidationResult Validate(string vatCode, VATKind?kind = null, VATLength?length = null, ushort minYear = 2012)
        {
            IVATCodeValidator <VATCodeValidationResult> validator = null;
            var valid = ValidatorHelper.ValidEmpty(vatCode, out VATCodeValidationResult result, ErrorMessage.Empty) &&
                        ValidatorHelper.ValidLength(vatCode, (int?)length, ErrorMessage.LengthOutOfRange, result) &&
                        ValidatorHelper.ValidImplement(vatCode, result, "VATCode{0}Validator", ErrorMessage.InvalidImplement, out validator, typeof(IVATCodeValidator <>));

            return(validator == null ? result : validator.Validate(vatCode, kind, minYear));
        }
        /// <summary>
        /// 验证当前增值税发票代码是否正确
        /// </summary>
        /// <param name="vatCode">发票代码</param>
        /// <param name="kind">发票类型</param>
        /// <param name="length">发票长度</param>
        /// <param name="minYear">最小年份</param>
        /// <returns></returns>
        public static VATCodeValidationResult Validate(string vatCode, VATKind?kind = null, int?length = null, ushort minYear = 2012)
        {
            IVATCodeValidator <VATCodeValidationResult> validator = null;

            _ = ValidatorHelper.ValidEmpty(vatCode, out VATCodeValidationResult result, ErrorMessage.Empty) &&
                ValidatorHelper.ValidLength(vatCode, length, ErrorMessage.LengthOutOfRange, result) &&
                ValidImplement(vatCode, result, out validator);
            return(validator == null ? result : validator.Validate(vatCode, kind, minYear));
        }
 private static bool ValidImplement(string code, VATCodeValidationResult result, out IVATCodeValidator <VATCodeValidationResult> validator)
 {
     _ = concurrentDictionary.TryGetValue(code.Length, out validator) ||
         ValidatorHelper.ValidImplement(code, result, "VATCode{0}Validator", ErrorMessage.InvalidImplement, out validator, typeof(IVATCodeValidator <>));
     return(validator != null);
 }