2009-06-30 2 views
4

주어진 값에서 상수 이름을 결정하는 방법이 있습니까? 다음 주어진 예값을 기준으로 상수 이름을 결정하십시오.

:

공개 CONST 수 UINT ERR_OK = 0x00000000의;

어떻게 "ERR_OK"를 얻을 수 있습니까?

나는 반성을보고 있었지만 나에게 도움이되는 것을 찾을 수는 없다.

답변

14

일반적으로 할 수 없습니다. 동일한 값을 가진 상수가 여러 개있을 수 있습니다. 상수를 선언 한 클래스를 아는 경우 모든 public static 필드를 찾아 값이 0 인 클래스가 있는지 확인할 수 있습니다. 그럼 다시, 너에게 충분할거야. 그렇지?

public string FindConstantName<T>(Type containingType, T value) 
{ 
    EqualityComparer<T> comparer = EqualityComparer<T>.Default; 

    foreach (FieldInfo field in containingType.GetFields 
      (BindingFlags.Static | BindingFlags.Public)) 
    { 
     if (field.FieldType == typeof(T) && 
      comparer.Equals(value, (T) field.GetValue(null))) 
     { 
      return field.Name; // There could be others, of course... 
     } 
    } 
    return null; // Or throw an exception 
} 
+0

감사합니다 Jon, 이것은 내가 생각하고 있던 라인을 따라 완전히 ... (평등 체크를하는 행에 누락 된 닫는 괄호가 있습니다.) 테스트에서 나는 다음을 얻습니다 : Member 'object.Equals (object, object) '는 인스턴스 참조로 액세스 할 수 없습니다. 대신 형식 이름으로 한정하십시오. '이것은 버그입니까? 이게 표면적으로 효과가있는 것처럼 보입니다. – Fraser

+0

아, 예 ... 저는 캐스트와 필드 유형에 대한 수표가 누락되었습니다. 수정 중 ... –

+0

완벽 해, 내가 필요한 것. 열거 형과 함께 수천 개의 상수를 가진 거대한 하드웨어 SDK를 포장해야하는 번거 로움을 덜어주었습니다. bouns로서 나는 모두 상수가 클래스 내에서 유일하다는 것을 알고있다. 정말 대단히 감사합니다. – Fraser

2

컴파일 타임에 상수가 리터럴 값으로 대체되므로이 작업을 수행 할 수 없습니다.

class Foo 
{ 
    uint someField = ERR_OK; 
} 

을이로 바뀝니다 :

은 즉 컴파일러는이 소요

class Foo 
{ 
    uint someField = 0; 
} 
0

나는 당신이 결정 론적 방법으로 그렇게 할 수 있다고 생각하지 않습니다. 같은 값을 가진 상수가 여러 개 있으면 어떨까요?

3

... 그렇다면 당신은 프로그래밍 반대 값으로 이름을 변환 할 수 있습니다 대신 열거 형,에 관심이있을 수 있습니다.

+0

제 3 자 Api와 협력 중이며 Enumaration으로 코드를 변환하는 것을 고려했습니다. * 많은 * * ... 감사합니다 :) – Fraser

1

상수를 나타 내기 위해 열거 형을 사용하는 것이 좋습니다.

또는

string ReturnConstant(uint val) 
{ 
    if(val == 0x00000000) 
     return "ERR_OK"; 
    else 
     return null; 
} 
1

가장 쉬운 방법은 내가 늦을 수 있습니다 열거

2

사용으로 전환하는 것입니다 ..하지만 난 대답을 할 수있는 다음과 같은

public static class Names 
    { 
     public const string name1 = "Name 01"; 
     public const string name2 = "Name 02"; 

     public static string GetNames(string code) 
     { 
      foreach (var field in typeof(Names).GetFields()) 
      { 
       if ((string)field.GetValue(null) == code) 
        return field.Name.ToString(); 
      } 
      return ""; 
     } 
    } 

및 다음과 같은 생각 "name1"

관련 문제