我正在尝试修复代码中的崩溃。
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
}
我很困惑为什么会这样做。有谁知道为什么会这样做和/或如何解决这个问题?
答案 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
}
}