0

我觉得这可能是个愚蠢的问题,但我无法得出我确定存在的简单解决方案。

我有一个 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)

该结构表示文件中所需的修复。

因此,如果有两种类型的修复,则应指定。

指示发生的所有错误的最佳方法是什么(将来可能有两个以上)?

要返回 ValidationResult 结构的列表?对枚举进行一些异或?还有什么想法吗?

4

3 回答 3

3

您可以使用属性 [Flags] 标记您的枚举

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx

于 2012-04-25T17:58:44.000 回答
0

我认为这对于打包的异常来说是一个不错的选择。您进行验​​证并创建要抛出的异常,然后抛出该聚合异常:

public IEnumerable<Exception> Validate(string configFile, string programFile)
{
    if(...)
      yield return new VersionsMismatchException(...);

    if(...)
      yield return new UnsupportedCombinationException(...);
}

然后你有一个方法,它接受所有的异常,然后将它们打包以抛出:

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
}

然后,无论您从中调用此验证方法的任何方法都只需要一个try/catch块来处理聚合异常并循环遍历聚合的每个异常并处理它们。

然后添加新规则就变成了 validate 方法中的另一个条件,其中包含一个新的 yield 语句。

每个单独的异常都可以具有特定于那个人的属性和数据,如果需要,它可以设置自己的消息来显示。

于 2012-04-25T18:02:17.273 回答
0

如果ValidationResult捕获有关单个验证规则结果的信息,则 return 是有意义的List<ValidationResult>

然后,您可以确定验证是否整体失败,例如results.Any(vr => !vr.Valid).

此外,是否在代码中做了一些事情来解决验证失败?枚举是否驱动代码打包和交付结果的方式/位置?我想知道枚举实现了什么。

于 2012-04-25T18:23:46.290 回答