2012-02-28 7 views
2

나는 간단한 파싱 문제를 해결하려고 노력하고 있으며 선택 목록을 인코딩하기 위해 enum을 사용하기로했다.총체적으로 enum을 형 변환 할 수 있습니까?

입력 데이터는 데이터가있는 고유 한 헤더와 고유하지 않은 식별자가있는 블록으로 분리 된 곧은 ASCII 텍스트입니다. 나는 데이터 의미에 대한 어떠한 문맥도 제공하지 않고 아주 일반적인 상징적 인 방법을 쓸 수 있으며 반환 된 후에는 그것을 처리 할 수 ​​있습니다.

문자열을 사용하면 문제가 없습니다. 나는 목록을 지나가고 우리가 간다.

열거 형을 일반화하는 구문을 이해할 수 없으며 일부 도움이 필요합니다. 나는 또한 명령적인 사고와 너무 쉬운 대답에 빠져있을 수 있습니다. 내가

private enum Colors { red, white, green }; 
private enum Suits { spades, clubs, hearts, diamonds }; 

// ... open files, read data, etc 
// so I pass in the enum that I want my result in and some text identifiers 

parseToEnum (Colors, searchBlock, "startColorBlock", "endColorBlock", "id="); 
parseToEnum (Suits, searchBlock, "startCardSuitsBlock", "endCardSuitsBlock", "<id="); 

// ... 

그래서 아이디어는 입력이 있기 때문에 (동일한 구조를 사용하는 것입니다 뭘하는지 여기

은의

private void parseToEnums(Enum returnEnum, string searchBlock, string startIDText, 
          string endIDText, string startText, string endText) 
{ 
    string ourSearchBlock = searchBlock; 
    int endIDidx = ourSearchBlock.IndexOf(endIDText); 

    while (ourSearchBlock.IndexOf(startText) != -1) 
    { 
     if (ourSearchBlock.Length == searchBlock.Length) 
     { 
      // first pass, trim off the region where the start text isn't valid 
      ourSearchBlock = ourSearchBlock.Remove(endIDidx, ourSearchBlock.Length - endIDidx); 
      // first pass, use the startIDtext to create a valid search zone 
      // BROKEN CODE HERE 
      // Neither GetType() nor typeof seem to do the right thing 
      // I have tried several varieties and have tried casting the LHS in the 
      // same sort of way 
      // pluckText returns a string that is guaranteed to match an enum name 
      returnEnum = (returnEnum.GetType()) System.Enum.Parse(typeof(returnEnum), pluckText(ourSearchBlock, startIDText, startText, endText), false); 
      ourSearchBlock = ourSearchBlock.Remove(0, ourSearchBlock.IndexOf(startIDText) + startIDText.Length); 
     } 
     else 
     { 
      // this would be similar to the above after it's working 
      // and is for the case where the string has multiple matches 
      // within the enum, ie "red white" 
      //returnList.Add(pluckText(ourSearchBlock, "", startText, endText)); 
     } 
     ourSearchBlock = ourSearchBlock.Remove(0, ourSearchBlock.IndexOf(startText) + startText.Length); 
    } 

    return; 
} 

예와 내가 힘든 시간을 보내고있어 코드의 같은)하지만 출력에 대해 다른 열거 형을 사용하십시오.

너무 오래 걸리기 전에 try/catch 래퍼와 일반적인 오류 검색을이 코드에 추가해야한다는 것을 알고 있습니다.

답변

9

나는 이러한 모든 검색을 무시하고 stringenum으로 변환하는 데 집중할 것입니다.

우선, 귀하의 방법은 을 반환해야하며 결과로 매개 변수로 전달하지 않아야합니다 (그 경우 out).

둘째, 메서드에 열거 형식을 전달하려면 Type 형식의 매개 변수를 사용하거나 더 나은 방법으로 일반 형식으로 만들고 형식 인수로 형식을 전달할 수 있습니다.

방법은 다음과 같을 수 있습니다 :

T ParseEnum<T>(string s) 
{ 
    return (T)Enum.Parse(typeof(T), s, false); 
} 

당신은 다음과 같이 호출 할 수 : 코드에서

Colors color = ParseEnum<Colors>(someString); 

오류는 다음과 같습니다

  • Enum가 일반적이다 기본 유형이 모두 enum이면 enum의 유형을 나타내지 않습니다. 즉, 메서드에 대한 매개 변수로 Colors을 사용할 수 없습니다.
  • 런타임에만 알려진 유형으로는 캐스트 할 수 없습니다. 즉, (foo.GetType())bar과 같은 코드는 절대로 작동하지 않습니다.
  • typeof 연산자를 사용하여 변수 유형을 가져올 수 없습니다. 특정 유형 (예 : 특정 유형)의 Type 개체를 가져 오는 데 사용할 수 있습니다. typeof(string) 또는 typeof(T)은 유형 인수 T 인 제네릭 메소드에 있습니다.
  • 유형 이름 (enum 포함)은 단명이어야합니다. 예를 들어 Color 유형의 변수는 하나의 색상을 나타 내기 때문입니다.이것은 단지 스타일 문제 일 뿐이지 만 코드가 작동하는 것을 멈추지는 않습니다. 하지만 코드를 이해하기가 어렵게 만듭니다.
+0

나는 그것을 포함하지 않은 경우 검색 :-)를 무시하고 자유롭게, 누군가가 충분한 정보를 제공하지 않는 나를 비난했을 것이다. 나는 이것을 많이 좋아하고 그것을 소용돌이 칠 것이다. – Stephen

+0

나는 또한 내가 color & = Par ...라고 쓸 수 있다는 점을 좋아한다. 이 방법으로 – Stephen

+0

당신은 그것을 쓰지만, 아마도 당신이 원하는대로 작동하지 않을 것입니다. '결합 | 동시에 여러 값을 나타낼 수있는'enum'를 원한다면, 당신은 중복되지 않는 바이너리 값으로 값을 (1, 2, 4, 8, ... 등) 및 사용 '으로 설정해야 그들. – svick

관련 문제