2014-11-14 109 views
0

我正在嘗試修復代碼中的崩潰。Enum.IsDefined無法識別有效的枚舉值

Enum.IsDefined返回 「假」,在這個方法時,它會檢查Item49

public static VocabularyEnum Status(Status currentStatus) 
{ 
    if (Enum.IsDefined(typeof(VocabularyEnum), (VocabularyEnum)currentStatus)) 
     return (VocabularyEnum)currentStatus; 
    else 
     throw new ArgumentOutOfRangeException("currentStatus"); 
} 

這裏是自動生成的詞彙辭典enum

[System.CodeDom.Compiler.GeneratedCodeAttribute("cxsc", "0.57.0.0")] 
[System.SerializableAttribute()] 
[System.Xml.Serialization.XmlTypeAttribute(TypeName="voc.Status",   
              Namespace="http://somenamespace/opennamespace")] 
public enum VocabularyEnum 
{ 
    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("1")] 
    Item1, 
    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("2")] 
    Item2, 
    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("3")] 
    Item3, 
    <...> 
    /// <remarks/> 
    [System.Xml.Serialization.XmlEnumAttribute("49")] 
    Item49, 
} 

if (Enum.IsDefined(typeof(VocabularyEnum), (int)currentStatus)) 

這裏是我的enum

public enum Status : byte 
{ 
    [Description("Description for item1")] 
    ReadableNameOne = 1, 
    [Description("Description for item2")] 
    ReadableNameTwo = 2, 
    [Description("Description for item3")] 
    ReadableNameThree = 3, 
    <...> 
    [Description("Description for item49")] 
    ReadableNameFourtyNine = 49 
} 

我很困惑它爲什麼這樣做。有誰知道爲什麼會這樣做和/或如何解決這個問題?

+1

這是什麼意思?什麼是錯誤信息? – 2014-11-14 16:06:59

+0

@ArsenMkrt通過「失敗」OP顯然意味着拋出的異常。 – BartoszKP 2014-11-14 16:07:25

+3

你能在調試器中確認'(int)currentStatus == 49'和那個'(int)VocabularyEnum.Item49 == 49'嗎? – 2014-11-14 16:08:24

回答

4

您所有的值由1的值從0開始轉向,而不是1所以VocabularyEnum.Item49值是48,而不是49但Status.ReadableNameFourtyNine值是49,因爲這是你指定什麼。因此(VocabularyEnum)Status.ReadableNameFourtyNine對於不是有效值...

+0

我剛纔已經測試了這個理論,奇怪的是即使我明確地說VocabularyEnum.Item49 = 49它仍然會失敗。我會重新檢查,當我做一個完整的項目重建,以確保 – Amoenus 2014-11-14 16:32:08

+0

已確認VocabularyEnum從零開始。讓我偏離軌道的是[System.Xml.Serialization.XmlEnumAttribute(「1」)] – Amoenus 2014-11-14 16:45:02

0

首先,代碼在任何情況下都不能「正確」工作。即如果我嘗試使用「Status.ReadableNameOne」,那麼我會得到「Item2」,我相信它不是您想要的「Item1」結果。第一個問題是,您要將「狀態」的枚舉實例轉換爲「VocabularyEnum」。下一個問題是XmlEnumAttribute只是一個屬性,並不是.Net枚舉邏輯的「可操作」部分。

爲了得到一個我認爲需要的版本,需要獲取currentStatus參數的int值並找到具有匹配的XmlEnumAttribute屬性的VocabularyItem。

下面的例子完全是這種方法。認爲這是必要的是醜陋的,但在我的測試中是完美無瑕的。警惕性能問題。

E.g.

public class Program 
{ 
    static void Main(string[] args) 
    { 
     Debug.WriteLine(CheckStatus(Status.ReadableNameOne)); 
     Debug.WriteLine(CheckStatus(Status.ReadableNameFourtyNine)); 
    } 

    public static VocabularyEnum CheckStatus(Status currentStatus) 
    { 
     var result = Enum.GetValues(typeof(VocabularyEnum)).Cast<object>().Where(e => 
      ((XmlEnumAttribute)typeof(VocabularyEnum) 
        .GetMember(e.ToString())[0] 
        .GetCustomAttributes(typeof(XmlEnumAttribute), false)[0]) 
        .Name == ((int)currentStatus).ToString()).FirstOrDefault(); 
     if (result != null) 
      return (VocabularyEnum)result; 
     else 
      throw new ArgumentOutOfRangeException("currentStatus"); 
    } 

    [System.CodeDom.Compiler.GeneratedCodeAttribute("cxsc", "0.57.0.0")] 
    [System.SerializableAttribute()] 
    [System.Xml.Serialization.XmlTypeAttribute(TypeName = "voc.Status", 
               Namespace = "http://somenamespace/opennamespace")] 
    public enum VocabularyEnum 
    { 
     /// <remarks/> 
     [System.Xml.Serialization.XmlEnumAttribute("1")] 
     Item1, 
     /// <remarks/> 
     [System.Xml.Serialization.XmlEnumAttribute("2")] 
     Item2, 
     /// <remarks/> 
     [System.Xml.Serialization.XmlEnumAttribute("3")] 
     Item3, 
     /// <remarks/> 
     [System.Xml.Serialization.XmlEnumAttribute("49")] 
     Item49, 
    } 

    public enum Status : byte 
    { 
     ReadableNameOne = 1, 
     ReadableNameTwo = 2, 
     ReadableNameThree = 3, 
     ReadableNameFourtyNine = 49 
    } 
} 
+0

是的,我也注意到了。我會看看是否有一種方法來重新生成枚舉,從一個或最壞的情況開始,將我的枚舉映射爲Match Item1 = 0,Item2 = 1 pattern – Amoenus 2014-11-14 16:50:36