質問

列挙をフレンドリーな文字列に変換する方法を作成しています。フレンドリーな名前はリソースファイルに保存され、グローバリゼーションの対象となります。そこで、2つのリソースファイルを作成しました:enums.resxとenums.pt-br.resxは、キーがenumの名前であるとその後の値(IE DeliviceStatus_WaitingForPayment)が続きます。

これは、リソースをロードし、列挙の対応するフレンドリー名を取得するために使用しているコードです。

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を現在の培養として使用している場合でも、enum.resxから値をロードし、enum.ptではありません。 -br.resx。

私は何が間違っているのですか?

役に立ちましたか?

解決

結局のところ、私はリソースファイルを読むために間違ったアプローチを取っていました。ストリームを通り抜ける必要がなかっただけでなく、現在の養殖に基づいて結果を得ることができませんでした。

ソリューションは私の最初の試みよりもはるかに簡単です:

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();
      }

}

これが誰もが将来似たようなことを試みるのに役立つことを願っています!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top