简体   繁体   English

如何从 .NET 资源 (RESX) 文件中按字符串值获取名称

[英]How to get Name by string Value from a .NET resource (RESX) file

Here's how my RESX file look like:这是我的 RESX 文件的样子:

Name            Value        Comments
Rule_seconds    seconds      seconds
Rule_Sound      Sound        Sound

What I want is: Name by string Value, something like below:我想要的是:按字符串值命名,如下所示:

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

And implement it like below:并像下面那样实现它:

string str = GetResxNameByValue("seconds");

so that str will return Rule_seconds这样str将返回Rule_seconds

Thanks!谢谢!

This could work这可以工作

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;

    }

With some additional error checking..通过一些额外的错误检查..

you can access directly by passing key:您可以通过传递密钥直接访问:

    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 "";
        }

    }

Just in case it might help anyone.以防万一它可以帮助任何人。 This ResourceHelper is inspired by jure and Mohan Singh Saini .这个 ResourceHelper 的灵感来自jureMohan 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;
    }
}
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();
    }
}

To Call this extension method,要调用此扩展方法,

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

In this case, we don't want to pass the resource assembly, rather we can invoke using the particular resource's resourceManager.在这种情况下,我们不想传递资源程序集,而是可以使用特定资源的 resourceManager 进行调用。

You could use this inline code (c#, ASP.NET MVC)您可以使用此内联代码(c#、ASP.NET MVC)

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

i think this could help u.我认为这可以帮助你。

Here is an limited example that:这是一个有限的例子:

  • Uses an resource files in a subfolder使用子文件夹中的资源文件
  • Uses an different culture than the default one使用与默认文化不同的文化

. .

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

The simple and straight forward method is -简单直接的方法是——

var keyValue = Resources.ResourceManager.GetString("AboutTitle");

In the above "AboutTitle" is the "KEY" part so if you have in the resource " AboutTitle= About " the above result for keyValue = About在上面的“AboutTitle”是“KEY”部分,所以如果你在资源“ AboutTitle=About ”中有keyValue=About的上述结果

I have used this in one of my project which is in VS2019.我在 VS2019 中的一个项目中使用了它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM