0

これはばかげた質問かもしれないと感じていますが、存在すると確信している単純な解決策にたどり着くことはできません。

構成ファイルを他のファイルに対して検証する C# クラスがあります。

列挙型で表される 2 種類のエラーが存在する可能性があります。

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)

構造体は、ファイルで必要な修正を表します。

したがって、2 種類の修正がある場合は、それを指定する必要があります。

すべてのエラーが発生したことを示す最良の方法は何ですか (将来的には 2 つ以上になる可能性があります)。

ValidationResult 構造体のリストを返すには? 列挙型の XOR を作成するには? 他のアイデアはありますか?

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(...);
}

次に、すべての例外を受け取り、それらをth​​row用にパッケージ化するメソッドがあります。

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、集約例外を処理し、集約の各例外をループしてそれらを処理するためのブロックが必要です。

新しいルールを追加すると、新しいyieldステートメントを使用してvalidateメソッドの別の条件になります。

個々の例外には、そのユーザーに固有のプロパティとデータを含めることができ、必要に応じて、表示する独自のメッセージを設定できます。

于 2012-04-25T18:02:17.273 に答える
0

ValidationResult単一の検証ルールの結果に関する情報を取得する場合は、 を返すのが理にかなっていList<ValidationResult>ます。

次に、検証が全体的に失敗したかどうかを次のように判断できresults.Any(vr => !vr.Valid)ます。

また、検証の失敗を解決するためにコードで何かが行われていますか? 列挙型は、コードによって結果がパッケージ化されて配信される方法/場所を駆動しますか? 列挙が何を達成するのか疑問に思っています。

于 2012-04-25T18:23:46.290 に答える