2014-11-14 2 views
0

코드에서 충돌을 해결하려고합니다.Enum.IsDefined가 유효한 enum 값을 인식하지 못합니다.

가 여기에

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

Item49가 자동 생성 어휘 사전 enum이다 확인할 때 Enum.IsDefined 반환 "거짓"이 방법 :

[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

그것은 무엇이라고 말합니까? 오류 메시지 란 무엇입니까? –

+0

@ArsenMkrt "OPing"으로 OP 분명히 던져 예외를 의미합니다. – BartoszKP

+3

디버거에서'(int) currentStatus == 49'와'(int) VocabularyEnum.Item49 == 49'을 확인할 수 있습니까? –

답변

4

모든 값이 1 씩 이동합니다. 의 값은 0이 아닌 1에서 시작합니다. 따라서 VocabularyEnum.Item49의 값은 49가 아닌 48입니다. 그러나 Status.ReadableNameFourtyNine의 값은 사용자가 지정한 값이므로 49입니다. 따라서 (VocabularyEnum)Status.ReadableNameFourtyNine은 에 대한 유효한 값이 아닙니다.

+0

VocabularyEnum.Item49 = 49라고해도 분명히 그 이론을 테스트했습니다. – Amoenus

+0

확증 된 어휘가 0으로 시작한다는 것을 확신하기 위해 전체 프로젝트 재 빌드를 다시 할 때 다시 검사 할 것입니다. 나를 벗어나게 한 것은 [System.Xml.Serialization.XmlEnumAttribute ("1")] – Amoenus

0

먼저 코드는 어떤 경우에도 "올바르게"작동하지 않습니다. 나는. "Status.ReadableNameOne"을 시도하면 "Item2"를 얻습니다.이 항목은 원하는 "Item1"결과가 아닙니다. 첫 번째 문제는 "Status"의 enum 인스턴스를 "VocabularyEnum"으로 캐스팅하는 것입니다. 다음 문제는 XmlEnumAttribute가 .Net enum 논리의 "작동 가능한"부분이 아니라 속성 일 뿐이라는 것입니다.

내가 이해할 수있는 버전을 얻으려면 currentStatus 매개 변수의 int 값을 가져와 일치하는 XmlEnumAttribute 특성을 가진 VocabularyItem을 찾아야합니다.

아래 예제는이 접근 방식을 정확하게 설명합니다. 이것이 필요하다고 생각하는 것은 추악하지만 내 테스트에서는 완벽합니다. 성능에 대해 염려 해주십시오.

예.

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

입니다. 그렇습니다. enum이 하나 또는 최악의 시나리오로 시작하도록 다시 생성하는 방법이 있는지 확인합니다. Item1 = 0, Item2 = 1 패턴과 일치하도록 enum을 매핑합니다. – Amoenus

관련 문제