2010-06-26 3 views
1

나는 열거 형을 친숙한 문자열로 변환하는 방법을 만들고 있습니다. 친숙한 이름은 리소스 파일에 저장되며 세계화의 대상이됩니다. 그래서 Enums.resx와 Enums.pt-BR.resx라는 두 개의 리소스 파일을 만들었습니다. 그 키는 열거 형의 이름 다음에 값이옵니다 (즉 DeliveryStatus_WaitingForPayment). 이 방법은 그것이 CurrentUICulture을 무시하고 항상에서 값을 반환하는 것을 제외하고는 거의 완벽하게 작동리소스를 동적으로로드하고 CurrentUICulture에 대한 올바른 값을 읽음

public static string EnumToString<T>(object obj) 
{ 
     string key = String.Empty; 

     Type type = typeof(T); 

     key += type.Name + "_" + obj.ToString(); 

     Assembly assembly = Assembly.Load("EnumResources"); 

     string[] resourceNames = assembly.GetManifestResourceNames(); 

     ResourceManager = null; 

     for(int i = 0; i < resourceNames.Length; i++) 
     { 
      if(resourceNames[i].Contains("Enums.resources")) 
      { 
       rm = new ResourceManager(resourceNames[i], Assembly.GetExecutingAssembly()); 

       Stream resStream = assembly.GetManifestResourceStream(resourceNames[i]); 

       ResourceReader reader = new ResourceReader(resStream); 

       IDictionaryEnumerator dict = reader.GetEnumerator(); 

       while (dict.MoveNext()) 
       { 
        string keyToCompare = dict.Key.ToString(); 

        if (keyToCompare == key) 
         return dict.Value.ToString(); 
       } 
      } 

      return obj.ToString(); 
     } 

} 

:

내가 자원을로드하고 열거에 해당하는 친숙한 이름을 얻기 위해 사용하고 코드입니다 기본 리소스, 즉 pt-BR을 CurrentUICulture로 사용하는 경우에도 Enum.ptx가 아닌 Enum.pt-BR.resx에서 값을로드합니다.

내가 뭘 잘못하고 있니?

답변

1

리소스 파일을 읽는 데 잘못된 접근 방식을 사용하고있는 것으로 나타났습니다. 뿐만 아니라 나는 CurrentUICulture를 기반으로 결과를 얻지 못하게하는 스트림을 통해 자신의 길을 일할 필요가 없었습니다.

이 솔루션은 내 첫 번째 시도보다 훨씬 쉽습니다 :

public static string EnumToString<T>(object obj) 
{ 
     string key = String.Empty; 

     Type type = typeof(T); 

     key += type.Name + "_" + obj.ToString(); 

     Assembly assembly = Assembly.Load("EnumResources"); 

     string[] resourceNames = assembly.GetManifestResourceNames(); 

     ResourceManager = null; 

     for(int i = 0; i < resourceNames.Length; i++) 
     { 
      if(resourceNames[i].Contains("Enums.resources")) 
      { 
       //The substring is necessary cause the ResourceManager is already expecting the '.resurces' 
       rm = new ResourceManager(resourceNames[i].Substring(0, resourceNames[i].Length - 10), assembly); 

       return rm.GetString(key); 
      } 

      return obj.ToString(); 
     } 

} 

나는이 사람이 미래에 비슷한 시도 도움이되기를 바랍니다!