21

Here's how my RESX file look like:

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

Thanks!

Learner
  • 3,904
  • 6
  • 29
  • 44
  • it seems this is only achievable if the resource file ensures no duplicate values,otherwise you might get unexpected resource keys returned. i.e. if you have two Names/keys (Time_Second, Sequence_Second), both have the value of 'second'. you might get the name of 'Time_second' when you expect the other one. – cli Apr 13 '17 at 04:40

7 Answers7

29

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..

Jurica Smircic
  • 6,117
  • 2
  • 22
  • 27
  • Thanks, and what if the resource file is in assembly and not an actual (RESX) file in the project? – Learner May 03 '13 at 15:05
  • You can specify assembly in which the resource is embeded in the ResourceManager constructor. But you still have to know resource base name. If you don't i think you could find out what resources are embeded into assembly by using Assembly.GetMainfestResourceNames – Jurica Smircic May 03 '13 at 15:08
  • @jure: Is it possible to return all the key value pairs from the resource? – Kuldeep Singh Jul 10 '15 at 08:01
5

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

    }
  • 3
    On 7 lines of code, I see a couple of problems that need to be addressed: First `RM.GetString(rulename)` already returns a string. There's no need to call `ToString()`. Second, `RM.GetString(rulename)` can return null is the resource is not found, which will raise a `NullReferenceException`. Third, `if(value !=null && value !="")` will never be reached with a null value because of the `NullReferenceException`. Finally, you can replace all the if by `return RM.GetString(rulename) ?? string.Empty;`. – PhilDulac Jun 09 '14 at 15:46
  • 3
    This does not address the original question which is the "reverse" of what you are posting as solution. By a specific value they key needs to be retrieved... – Youp Bernoulli Sep 21 '15 at 11:18
2

Just in case it might help anyone. This ResourceHelper is inspired by jure and 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;
    }
}
Community
  • 1
  • 1
oloopy
  • 303
  • 2
  • 5
  • Any thoughts on how to reference strings resource in a referenced project? I keep getting an exception when attempting to reference it. – BrianS Aug 19 '14 at 17:20
  • I found it. For loaded RESX files you can reference the built-in resource manager. See http://stackoverflow.com/a/22494089/264628. – BrianS Aug 19 '14 at 17:49
  • @BrianS Thanks for the supplement :) – oloopy Aug 21 '14 at 14:50
2

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

I have used this in one of my project which is in VS2019.

1
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.

  • 1
    ResourceManagerHelper is a common extension for ResourceManager. Every Resource file have Resource Manager, for example: **Rule.resx** is a resource file. Then to call `Rule.ResourceManager.GetResourceName(val, mycultureinfo) ` – Shyam Sundar Apr 09 '15 at 11:00
0

You could use this inline code (c#, ASP.NET MVC)

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

i think this could help u.

0

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();
}
Andriod
  • 1,239
  • 12
  • 18