2012-04-25 32 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;} 
    } 

功能接口看起來像這樣:

public ValiditionResult Validate(string confFile, string progFile) 

該結構體代表文件中所需的修復程序。

因此,如果有兩種類型的修復,應該指定它。

什麼是表明所有錯誤發生的最佳方式(未來可能有兩個以上)?

要返回ValidationResult結構體的列表?做一些異或的枚舉?任何其他想法?

回答

3

你可以標記與屬性的枚舉[國旗]

看到http://msdn.microsoft.com/en-us/library/system.flagsattribute.aspx獲取更多信息。

+0

+1並刪除了我的副本。 – zimdanen 2012-04-25 17:59:57

+1

更多信息,請訪問:http://msdn.microsoft.com/en-us/library/cc138362.aspx查看枚舉類型作爲位標誌。 – zimdanen 2012-04-25 18:00:40

+0

標誌很棒,我一直都在使用它們。但是,您必須瞭解您的開發人員受衆。如果很多新開發人員會查看此代碼,則可能需要使用List。在[Flags]枚舉中使用按位運算符可能會讓人困惑,並且可能會誤用它。 – Scen 2012-04-25 18:08:44

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語句。

每個單獨的例外都可以具有特定於該傢伙的屬性和數據,並且如果需要,它可以設置它自己的消息以顯示。

0

如果ValidationResult捕獲有關單個驗證規則結果的信息,則返回List<ValidationResult>是有意義的。

然後,您可以確定整體驗證是否失敗,如results.Any(vr => !vr.Valid)

另外,有沒有在代碼中解決驗證失敗的事情?枚舉是否驅動結果如何/在哪裏打包並通過代碼傳遞?我想知道枚舉是如何實現的。