2012-04-25 12 views
0

これは愚かな質問かもしれないと感じていますが、私は確かに存在するという単純な解決策には出くわしません。C#:戻り値のエラーの組み合わせの処理

他のファイルに対して構成ファイルを検証する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;} 
    } 

このような機能のインターフェースの外観は:

列挙型で表現されるエラーの2種類が存在してもよいです

public ValiditionResult Validate(string confFile, string progFile) 

structは、ファイルに必要な修正を表します。

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

エラーが発生したことを示す最も良い方法は何ですか(今後2つ以上ある可能性があります)。

ValidationResult構造体のリストを返すには? EnumのXORを作るには?他のアイデア?

答えて

3

あなたは[フラグ]

は、詳細はhttp://msdn.microsoft.com/en-us/library/system.flagsattribute.aspxを参照属性を使用して列挙型をマークできます。

+0

+1と私の複製を削除しました。 – zimdanen

+1

詳細はこちら:http://msdn.microsoft.com/en-us/library/cc138362.aspx列挙型をビットフラグとして見てください。 – zimdanen

+0

フラグは素晴らしいです、私はそれらを常時使用しています。しかし、開発者の聴衆に知っておく必要があります。多くの新しい開発者がこのコードを見ている場合は、代わりにListを使うことができます。 [Flags]列挙型でビットワイズ演算子を使用すると、見るのが混乱する可能性があり、それらを誤用する可能性があります。 – Scen

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ブロックにするだけです。

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

それぞれの例外は、その男に固有のプロパティとデータを持つことができ、必要に応じて、それ自身のメッセージを表示するように設定できます。

0

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

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

また、妥当性検査の失敗を解決するためにコードに何かが行われていますか?列挙型は、結果がパッケージ化され、コードによってどのように/どこで提供されるのか?列挙が何を達成しているのだろうかと思います。