web-dev-qa-db-ja.com

.NETリソース(RESX)ファイルから文字列値で名前を取得する方法

RESXファイルは次のようになります。

Name            Value        Comments
Rule_seconds    seconds      seconds
Rule_Sound      Sound        Sound

私が欲しいのは、文字列値による名前、以下のようなものです:

public string GetResxNameByValue(string value)
{
// some code to get name value
}

以下のように実装します:

string str = GetResxNameByValue("seconds");

strRule_secondsを返すように

ありがとう!

15
Learner

これは動作する可能性があります

private string GetResxNameByValue(string value)
    {
            System.Resources.ResourceManager rm = new System.Resources.ResourceManager("YourNamespace.YourResxFileName", this.GetType().Assembly);


        var entry=
            rm.GetResourceSet(System.Threading.Thread.CurrentThread.CurrentCulture, true, true)
              .OfType<DictionaryEntry>()
              .FirstOrDefault(e => e.Value.ToString() ==value);

        var key = entry.Key.ToString();
        return key;

    }

いくつかの追加のエラーチェック付き。

24
jure

キーを渡すことで直接アクセスできます:

    public  string gtresource(string rulename)
    {
        string value = null;
        System.Resources.ResourceManager RM = new System.Resources.ResourceManager("CodedUITestProject1.Resource1", this.GetType().Assembly);
        value = RM.GetString(rulename).ToString();

        if(value !=null && value !="")
        {
            return value;

        }
        else
        {
            return "";
        }

    }
5

念のため、それは誰にも役立つかもしれません。このResourceHelperは jure および Mohan Singh Saini に触発されています。

using System.Collections;
using System.Linq;
using System.Reflection;
using System.Resources;
using System.Threading;

public class ResourceHelper
{
    /// <summary>
    ///     ResourceHelper
    /// </summary>
    /// <param name="resourceName">i.e. "Namespace.ResourceFileName"</param>
    /// <param name="Assembly">i.e. GetType().Assembly if working on the local Assembly</param>
    public ResourceHelper(string resourceName, Assembly assembly)
    {
        ResourceManager = new ResourceManager(resourceName, Assembly);
    }

    private ResourceManager ResourceManager { get; set; }

    public string GetResourceName(string value)
    {
        DictionaryEntry entry = ResourceManager.GetResourceSet(Thread.CurrentThread.CurrentCulture, true, true).OfType<DictionaryEntry>().FirstOrDefault(dictionaryEntry => dictionaryEntry.Value.ToString() == value);
        return entry.Key.ToString();
    }

    public string GetResourceValue(string name)
    {
        string value = ResourceManager.GetString(name);
        return !string.IsNullOrEmpty(value) ? value : null;
    }
}
2
oloopy

以下は限定的な例です:

  • サブフォルダー内のリソースファイルを使用します
  • デフォルトとは異なるカルチャを使用します

public static string GetLocalizedNameReversed(string value)
{
    ResourceManager rm = new ResourceManager($"YourNamespace.YourFolder.YourResourceFileName", Assembly);

    var entry = rm.GetResourceSet(new CultureInfo("nb-NO"), true, true)
            .OfType<DictionaryEntry>()
            .FirstOrDefault(e => e.Value.ToString().Equals(value, StringComparison.OrdinalIgnoreCase));

    return entry.Key.ToString();
}
0
Andriod

このインラインコードを使用できます(c#、ASP.NET MVC)

var _resource = new ResourceManager(typeof(/*your resource*/));
string res = _resource.GetString(/*resource key*/);

私はこれがあなたを助けることができると思う。

0
FarazLoloei
public static class ResourceManagerHelper
{
    public static string GetResourceName(this ResourceManager resourceManager, string value, CultureInfo cultureInfo, bool ignoreCase = false)
    {
        var comparisonType = ignoreCase ? System.StringComparison.OrdinalIgnoreCase : System.StringComparison.Ordinal;
        var entry = resourceManager.GetResourceSet(cultureInfo, true, true)
                                   .OfType<DictionaryEntry>()
                                   .FirstOrDefault(dictionaryEntry => dictionaryEntry.Value.ToString().Equals(value, comparisonType));

        if (entry.Key == null)
            throw new System.Exception("Key and value not found in the resource file");

        return entry.Key.ToString();
    }
}

この拡張メソッドを呼び出すには、

var key = Resources.ResourceManager.GetResourceName(value, CultureInfo.InvariantCulture, true);

この場合、リソースAssemblyを渡したくないので、特定のリソースのresourceManagerを使用して呼び出すことができます。

0
Shyam Sundar