C# 如何从 .NET 资源 (RESX) 文件中按字符串值获取名称
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16361685/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to get Name by string Value from a .NET resource (RESX) file
提问by Learner
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 strwill return Rule_seconds
这样str就会回来Rule_seconds
Thanks!
谢谢!
采纳答案by jure
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..
通过一些额外的错误检查..
回答by Mohan Singh Saini
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 "";
}
}
回答by oloopy
Just in case it might help anyone. This ResourceHelper is inspired by jureand Mohan Singh Saini.
以防万一它可以帮助任何人。这个 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;
}
}
回答by Shyam Sundar
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 进行调用。
回答by FarazLoloei
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.
我认为这可以帮助你。
回答by Andriod
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();
}

