【问题标题】:Getting a string dynamically from strings resources从字符串资源中动态获取字符串
【发布时间】:2012-11-02 11:26:08
【问题描述】:

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

using MyNamespace.Resources

...

string someString = strings.someString;

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

string someString = GetString("someString");

我一直在玩弄ResourceManager,但我找不到将它指向我的strings.resx 文件的方法。

我该怎么做?

【问题讨论】:

    标签: c# resources


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      你可以这样写一个静态方法:

      public static string GetResourceTitle<T>(string key)
      {
        ResourceManager rm = new ResourceManager(typeof(T));
        string someString = rm.GetString(key);
        return someString;
      }
      

      并在任何地方调用:

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

      当你想要一个通用函数来获取任何资源文件的字符串时,它很有用。

      【讨论】:

      • 非常好的解决方案!
      【解决方案3】:

      有更简单的方法来做到这一点

       [NameOfyourResxfile].ResourceManager.GetString("String Name");
      

      你的情况

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

      【讨论】:

        【解决方案4】:

        ResourceManager.GetString 应该可以。

        来自 MSDN 的精简示例:

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

        【讨论】:

        • 是的,我发现了,但现在知道我应该如何实例化我的ResourceManager。我让它与ResourceManager rm = strings.ResourceManager;一起工作。无需实例化:它已经存在了。
        • @Bart:你试过constructor with assembly吗?
        • 是的,但我不知道 "RootResourceName"SomeClass 应该是什么。 strings.ResourceManager 更简单。
        • @Bart:只有在进入程序集时才需要类。你也许可以只使用Assembly.GetCurrentAssembly 或类似的。根据文档,RootResourceName 是“资源文件的根名称,不带扩展名,但包括任何完全限定的命名空间名称。例如,名为 MyApplication.MyResource.en-US.resources 的资源文件的根名称是 MyApplication.MyResource。”但是,如果资源管理器已经可用,则最好按原样使用。
        【解决方案5】:

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

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

        与@Vlad 的解决方案非常相似,但除此之外我有一个MissingManifestResourceException

        【讨论】: