Enum.IsDefined无法识别有效的枚举值

时间:2014-11-14 16:04:01

标签: c# enums

我正在尝试修复代码中的崩溃。

Enum.IsDefined在检查Item49

时在此方法中返回“false”
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
}

我很困惑为什么会这样做。有谁知道为什么会这样做和/或如何解决这个问题?

2 个答案:

答案 0 :(得分:4)

所有值都移动了1. VocabularyEnum的值从0开始,而不是1.因此VocabularyEnum.Item49的值是48,而不是49.但是Status.ReadableNameFourtyNine的值是49,因为这是你指定的。因此(VocabularyEnum)Status.ReadableNameFourtyNine不是VocabularyEnum ...

的有效值

答案 1 :(得分:0)

首先,代码没有正常工作&#34;在任何情况下。即如果我尝试使用&#34; Status.ReadableNameOne&#34;然后我得到&#34; Item2&#34;,我有信心不是&#34; Item1&#34;结果你也想要。第一个问题是你正在构建一个&#34;状态&#34;的枚举实例。 as&#34; VocabularyEnum&#34;。下一个问题是XmlEnumAttribute只是一个属性,而不是&#34;可操作的&#34; .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
    }
}