2010-03-05 3 views
5

사전을 사용하여 특정 시스템에서 허용하는 트랜잭션 유형 목록을 보유하는 시나리오가 있습니다. 사전의 키는 열거 형 필드이고, 값은 int입니다.Dictionary 컬렉션의 키로 열거하는 데 문제가 있습니다.

우리가 사전에 현장을 찾아
sqlCommand.Parameters.AddWithValue("@param", LookupDictionary[argument.enumField]); 

, 우리는 올바른 정수 값을받을거야 : 시스템의 어떤 시점에서

, 우리는 이런 일을하고 싶은거야 데이터베이스로 피드 실제로 enum int 값을 사용하려고 생각했지만 정확한 것은 아닙니다. 우리는 우리가하고있는 업데이트 종류를 나타 내기 위해 마법의 숫자를 입력해야하는 시스템과 상호 작용하고 있습니다.

위의 코드는 정상적으로 작동합니다. 알려진 형식을 추가하는 이니셜 라이저 메서드가 있습니다.

LookupDictionary = new Dictionary<mynamespace.myproject.myclass.enumType, int>(); 
LookupDictionary.Add(enumType.entry1, 4); 
LookupDictionary.Add(enumType.entry2, 5); 
LookupDictionary.Add(enumType.entry3, 6); 

이 코드는 제대로 작동합니다.

위와 같이 실제로 LookupDictionary를 사용하기 전에 요청한 내용이 실제로 지원하는 enum 값으로 설정되어 있는지 확인합니다. LookupDictionary의 주된 이유는 유효한 메서드를 보유하고 있기 때문입니다 (이 메서드가 작동하지 않는 유효한 enum 항목이 있음).

이 코드는 작동하지 않습니다. 시스템이 열거 형이 일치하는지 인식하지 못합니다. 디버거에서 LookupDictionary의 항목 목록에 entry2에 대한 값이 있다는 것을 알 수 있습니다. 그냥 entry2처럼 호출합니다. 반면에 들어오는 enumField에는 완전한 네임 스페이스가 있습니다. mynamespace.myproject.myclass.enumType.entry2 - 이것이 같은 것으로 보이지 않는 이유라고 생각합니다.

if (!LookupDictionary.ContainsKey(argument.enumField)) 
{ 
    throw new InvalidOperationException("argument.enumField not valid in blahMethod."); 
} 

이 내용이 WCF 서비스를 통해 전달되고 있음을 언급 했습니까? 하지만 자동 생성 프록시를 사용하지는 않습니다 ... 양측 모두 프로젝트에서 프로젝트 참조로 유형을 공유하고 코드에서 내 채널 클라이언트를 구축합니다.

아이디어가 있으십니까? 내가 잘못하고 있니? 열거 형을 가진 사전은 잘 작동하지 않습니까? WCF일까요?

참고 : magic int를 포함하도록 enum을 설정하는 것에 대한 제안은입니다. 그러나 나는 그러한 것들을 가능한 한 "마법의 숫자"4 5와 6이 길 아래로 바뀔지도 모른다고 생각했다. 내가 열거에 그들을 코딩이 경우 제안 :

public enum MyEnum 
{ 
    MyValue1 = 4, 
    MyValue2 = 5, 
    MyValue3 = 6 
} 

내가 런타임에 미래에 매직 넘버를 설정하는 방법을 쓸 수있는 능력을 잃게; 대신 코드를 변경해야합니다.

+3

사전은 열거 형을 키로 사용하는 데 문제가 없으며 WCF와 관련이 있는지 의심 스럽다. 여기에는 작은 코드 단편 만 있습니다. 문제를 재현하는 짧지 만 완전한 프로그램이 일부 답변을 이끌어 낼 수 있습니다. 가장 간단한 가능한 경우부터 시작하여 사전에 열거 키를 추가하고 그 열이 있는지 확인하십시오. 그런 다음 코드가 실패한 장소에 도달 할 때까지 점차적으로 빌드하십시오. – Aaronaught

+0

네 말이 맞을거야. 나는 어딘가에 약간의 오류가 있다는 강한 느낌을 가지고있다. 그냥 내가 버릴 줄 알았다. 최소한 하나의 WCF 담당자가 자동 ​​생성 프록시라고 생각했기 때문에 DataContracts에 대한 공유 프로젝트를 기반으로 조직을 다시 구성했습니다. 모든 것이 잘되었지만 문제를 해결하지 못했습니다. –

답변

3

을 열거의 정수 표현을 사용

public void DoDbWork(ArgumentTypes argType, object otherParameter) 
{ 
    if (argType == ArgumentTypes.Arg3) { 
     throw new ArgumentException("Argument of value " + argType + " is not valid in this context", "argType"); 
    } 

    // Handle db transaction here 
} 

는 매개 변수로 int 값을 추가합니다. 예를 들어

:

LookupDictionary = new Dictionary<int, int>(); 
LookupDictionary.Add((int)enumType.entry1, 4); 
LookupDictionary.Add((int)enumType.entry2, 5); 
LookupDictionary.Add((int)enumType.entry3, 6); 

그런 식으로, 당신은 사전 같은 'ContainsKey'방법을 사용할 수 있습니다. 나는 이것보다 훨씬 더 좋은 성능인지 확신 할 수 없다. List<int>

+0

흠, 고마워 ... 나는 이것을 좋아한다. 필자가 원했던 동일한 유지 관리 기능을 제공하고 나중에 구성에서 다시 작성할 수있는 기능을 유지해야합니다. –

+0

일했습니다! 아직도 무슨 일이 일어나고 있는지 확실하지 않습니다. "제대로 들어오지"않는이 서비스에 전달되는 다른 필드가 있으므로 다른 곳에서 문제가 의심됩니다. 하지만 내 문제가 해결되었습니다. 감사! –

0

열거 형을 int (또는 기본 형식이 무엇이든간에)로 명시 적으로 입력 한 다음 열거 형의 값을 데이터베이스 값으로 설정할 수 있습니까? 이미 열거 형을 데이터베이스에 단단히 결합 했으므로 관계가 C# (현재 하드 코딩) 또는 SQL (아마도 ID를 반환하는 proc 및 열거 형으로 구문 분석 될 수있는 문자열로 지정됩니다. .) 당신의 열거는 int이며 가정을 사용하여

...

enum enumType { 
    entry1 = 4, 
    entry2 = 5, 
    entry3 = 6 
} 

당신은 그럼 그냥 열거의 기본 형식으로 캐스팅 할 당신의 매개 변수를 추가.

sqlCommand.Parameters.AddWithValue("@param", (int)argument.enumField); 
+0

열거 형은 데이터베이스에 유효한 값을 나타 내기 위해 존재하며 단단히 결합 되어도 문제가되지 않습니다. 문제는 그들이 바뀌면 런타임에 올바른 "매직 넘버"를 생성 할 수 있기를 바랍니다. 내가 지정한 것처럼 entry1 = 4로 설정하면 루프를 감쌀 수 없습니다. 실제 값은 변경되지 않고 int 표현이 변경 될 수 있습니다. 예를 들어 entry1은 오늘 4 일 수 있지만 일주일에 40 일 수 있습니다. Lookup.Add를 사용하면 나중에 DB에서 올바른 마술 값을 가져 와서 조회 사전에 저장하는 메소드를 작성할 수 있습니다. –

1

당신은 모두 여기에 조회 테이블을 필요가 없습니다 :

public enum MyEnum 
{ 
    MyValue1 = 4, 
    MyValue2 = 5, 
    MyValue3 = 6 
} 

// Sample usage 
MyEnum firstEnum = MyEnum.MyValue1; 
int intVal = (int)firstEnum; // results in 4 

// Enum Validation 
bool valid = Enum.IsDefined(typeof(MyEnum), intVal); // results in true 
+0

enum에이 메서드로 처리 할 수없는 항목이 있습니다. 따라서 조회의 요점은 우리가 처리 할 수없는 유형으로 설정된 요청으로 호출 중인지 확인하는 것입니다. –

0

는 명시 적으로

enum ArgumentTypes { 
    Arg1 = 1; 
    Arg2 = 3; 
    Arg3 = 5; 
} 

필요하지 않은 구문을 사용하여 열거 형의 값을 설정할 수 있습니다 이 문법이 작동하려면 열거 형에서 각 값을 순차적으로 유지해야합니다.

메서드에 유효한 매개 변수 만 사용되었는지 확인하려면이 예제 코드를 시도하십시오. 참고이 컨텍스트에서 InvalidOperationException에 대해 ArgumentException을 사용하는 것이 좋습니다. 대신, 키로서 열거를 사용

cmd.Parameters.AddWithValue("@paramName", (int)argType); 
관련 문제