using System.Data; using Validation.Core; namespace Validation.Validator { /// /// 简单校验类 /// public class SimpleDataValidator : IDataValidator { private const int MaxValidationErrors = 100; private readonly List rules = new List(); public void AddRule(IValidationRule rule) { rules.Add(rule ?? throw new ArgumentNullException(nameof(rule))); } /// public void RemoveRule(string ruleName) { rules.RemoveAll(r => r.RuleName == ruleName); } /// public IEnumerable GetRules() => rules.AsReadOnly(); /// public ValidationResult Validate(DataTable dataTable) { return Validate(dataTable, rules); } /// public ValidationResult Validate(DataTable dataTable, IEnumerable customRules) { var result = new ValidationResult { IsValid = true }; if (dataTable == null) { result.AddError(-1, "数据表不能为空"); return result; } foreach (var rule in customRules) { try { var ruleResult = rule.Validate(dataTable); if (!ruleResult.IsValid) { result.IsValid = false; result.Errors.AddRange(ruleResult.Errors); } result.Warnings.AddRange(ruleResult.Warnings); } catch (Exception ex) { result.AddError(-1, $"规则 '{rule.RuleName}' 执行异常: {ex.Message}"); } } return result; } public ValidationResult Validate(string[] headers, int rowIndex, object[] values, IEnumerable customRules) { var result = new ValidationResult { IsValid = true }; foreach (var rule in customRules) { try { var ruleResult = rule.Validate(headers, rowIndex, values); if (!ruleResult.IsValid) { result.IsValid = false; result.Errors.AddRange(ruleResult.Errors); } result.Warnings.AddRange(ruleResult.Warnings); if (result.Errors.Count > MaxValidationErrors) { return result; } } catch (Exception ex) { result.AddError(-1, $"规则 '{rule.RuleName}' 执行异常: {ex.Message}"); } } return result; } public ValidationResult Validate(string[] headers, int rowIndex, object[] values) { return Validate(headers, rowIndex, values, rules); } } }