我觉得这可能是一个愚蠢的问题,但我不能找到我确定存在的简单解决方案。
我有一个C#类,可以根据其他文件验证配置文件。
可能有两种错误,它们在枚举中表示:
public enum ErrorType
{
VersionsMismatch,
UnsupportedCombination
}
有一个表示错误的结构:
public struct ValiditionResult
{
public bool Valid { get; set; }
public string ErrorMessage { get; set; }
public ErrorType ErrorType { get; set; }
public List<ConfProperties> InvalidProperties {get;set;}
}
功能界面如下所示:
public ValiditionResult Validate(string confFile, string progFile)
struct表示文件中所需的修复。
因此,如果有两种类型的修复,则应指定它。
指出所有错误的最佳方法是什么(将来可能会有两个以上)?
要返回ValidationResult结构的列表?对Enum进行一些异或?还有其他想法吗?
答案 0 :(得分:3)
您可以使用属性[Flags]
标记枚举请参阅http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx了解详情。
答案 1 :(得分:0)
我认为这对于打包的异常是个不错的选择。您进行验证并创建抛出异常,然后抛出该聚合异常:
public IEnumerable<Exception> Validate(string configFile, string programFile)
{
if(...)
yield return new VersionsMismatchException(...);
if(...)
yield return new UnsupportedCombinationException(...);
}
然后你有一个方法可以获取所有异常,然后将它们打包为throw:
public void EnsureConfigurationIsValid(string configFile, string programFile)
{
var exceptions = Validate(configFile, programFile).ToList();
if(exceptions.Count > 0)
throw new ValidationFailedException(exceptions); // creates an internal list
}
然后,您调用此validate方法的任何方法都只需要一个try/catch
块来处理聚合异常并循环遍历聚合的每个异常并处理它们。
添加新规则然后只是使用新的yield语句成为validate方法中的另一个条件。
每个单独的异常都可以包含特定于该人的属性和数据,并且如果需要,它可以设置自己要显示的消息。
答案 2 :(得分:0)
如果ValidationResult
捕获有关单个验证规则结果的信息,则返回List<ValidationResult>
是有意义的。
然后,您可以使用results.Any(vr => !vr.Valid)
等确定整体验证是否失败。
此外,代码中是否有一些事情可以解决验证失败?枚举是否会驱动代码打包和交付结果的方式/位置?我想知道枚举是什么实现的。