주어진 값에서 상수 이름을 결정하는 방법이 있습니까? 다음 주어진 예값을 기준으로 상수 이름을 결정하십시오.
:
공개 CONST 수 UINT ERR_OK = 0x00000000의;
어떻게 "ERR_OK"를 얻을 수 있습니까?
나는 반성을보고 있었지만 나에게 도움이되는 것을 찾을 수는 없다.
주어진 값에서 상수 이름을 결정하는 방법이 있습니까? 다음 주어진 예값을 기준으로 상수 이름을 결정하십시오.
:
공개 CONST 수 UINT ERR_OK = 0x00000000의;
어떻게 "ERR_OK"를 얻을 수 있습니까?
나는 반성을보고 있었지만 나에게 도움이되는 것을 찾을 수는 없다.
일반적으로 할 수 없습니다. 동일한 값을 가진 상수가 여러 개있을 수 있습니다. 상수를 선언 한 클래스를 아는 경우 모든 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
}
컴파일 타임에 상수가 리터럴 값으로 대체되므로이 작업을 수행 할 수 없습니다.
class Foo
{
uint someField = ERR_OK;
}
을이로 바뀝니다 :
은 즉 컴파일러는이 소요
class Foo
{
uint someField = 0;
}
나는 당신이 결정 론적 방법으로 그렇게 할 수 있다고 생각하지 않습니다. 같은 값을 가진 상수가 여러 개 있으면 어떨까요?
... 그렇다면 당신은 프로그래밍 반대 값으로 이름을 변환 할 수 있습니다 대신 열거 형,에 관심이있을 수 있습니다.
제 3 자 Api와 협력 중이며 Enumaration으로 코드를 변환하는 것을 고려했습니다. * 많은 * * ... 감사합니다 :) – Fraser
상수를 나타 내기 위해 열거 형을 사용하는 것이 좋습니다.
또는
string ReturnConstant(uint val)
{
if(val == 0x00000000)
return "ERR_OK";
else
return null;
}
가장 쉬운 방법은 내가 늦을 수 있습니다 열거
사용으로 전환하는 것입니다 ..하지만 난 대답을 할 수있는 다음과 같은
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"
감사합니다 Jon, 이것은 내가 생각하고 있던 라인을 따라 완전히 ... (평등 체크를하는 행에 누락 된 닫는 괄호가 있습니다.) 테스트에서 나는 다음을 얻습니다 : Member 'object.Equals (object, object) '는 인스턴스 참조로 액세스 할 수 없습니다. 대신 형식 이름으로 한정하십시오. '이것은 버그입니까? 이게 표면적으로 효과가있는 것처럼 보입니다. – Fraser
아, 예 ... 저는 캐스트와 필드 유형에 대한 수표가 누락되었습니다. 수정 중 ... –
완벽 해, 내가 필요한 것. 열거 형과 함께 수천 개의 상수를 가진 거대한 하드웨어 SDK를 포장해야하는 번거 로움을 덜어주었습니다. bouns로서 나는 모두 상수가 클래스 내에서 유일하다는 것을 알고있다. 정말 대단히 감사합니다. – Fraser