C# 从字符串资源动态获取字符串

C# 从字符串资源动态获取字符串,c#,resources,C#,Resources,我正在开发一个本地化的C#.NET应用程序,我们正在使用strings.resx文件翻译应用程序中的硬编码字符串。我使用以下代码来提取它们: using MyNamespace.Resources ... string someString = strings.someString; 但是,现在我希望能够在调用中定义字符串的名称,如下所示: string someString = GetString("someString"); public static string GetResou

我正在开发一个本地化的C#.NET应用程序,我们正在使用
strings.resx
文件翻译应用程序中的硬编码字符串。我使用以下代码来提取它们:

using MyNamespace.Resources

...

string someString = strings.someString;
但是,现在我希望能够在调用中定义字符串的名称,如下所示:

string someString = GetString("someString");
public static string GetResourceTitle<T>(string key)
{
  ResourceManager rm = new ResourceManager(typeof(T));
  string someString = rm.GetString(key);
  return someString;
}
我一直在玩弄
ResourceManager
,但是我找不到一种方法将它指向我的
strings.resx
文件

我该怎么做?

该怎么做

MSDN中的简化示例:

ResourceManager rm = new ResourceManager("RootResourceName",
                                         typeof(SomeClass).Assembly);
string someString = rm.GetString("someString");

稍微搜索一下就成功了。我的
strings
类中有正确的
ResourceManager

ResourceManager rm = strings.ResourceManager;
string someString = rm.GetString("someString");

我在使用ASP.NET Core MVC时遇到了同样的问题,并设法用

ResourceManager rm = new ResourceManager(typeof(YourResourceClass));
string someString = rm.GetString("someString");

非常类似于@Vlad的解决方案,但在其他方面,我有一个
MissingManifestResourceException

您可以编写如下静态方法:

string someString = GetString("someString");
public static string GetResourceTitle<T>(string key)
{
  ResourceManager rm = new ResourceManager(typeof(T));
  string someString = rm.GetString(key);
  return someString;
}
公共静态字符串GetResourceTitle(字符串键)
{
ResourceManager rm=新的ResourceManager(类型(T));
string someString=rm.GetString(key);
返回sometstring;
}
并随时拨打:

var title=  GetResourceTitle<*YouResourceClass*>(key);
var title=GetResourceTitle(键);

当您需要一个通用函数来获取任何资源文件的字符串时,它非常有用。

有一种更简单的方法

 [NameOfyourResxfile].ResourceManager.GetString("String Name");
就你而言

strings.resx.ResourceManager.GetString("someString");

是的,我发现了,但现在我知道应该如何实例化我的
ResourceManager
。我使用
ResourceManager rm=strings.ResourceManager。无需实例化IE:它已经在那里了。@Bart:你试过了吗?是的,但我不知道
“RootResourceName”
SomeClass
应该是什么。
strings.ResourceManager
要简单得多。@Bart:class仅用于访问程序集。您可能只需要使用
Assembly.GetCurrentAssembly
之类的工具。而
RootResourceName
是,根据文档,“资源文件的根名称,不带扩展名,但包含任何完全限定的命名空间名称。例如,名为MyApplication.MyResource.en-US.resources的资源文件的根名称是MyApplication.MyResource。”但是,如果资源管理器已经可用,最好照原样去做。很好的解决方案!