循环遍历.resx文件中的所有资源

np.*_*np. 123 .net c# embedded-resource

有没有办法循环使用.resxC#中的文件中的所有资源?

Oun*_*ess 235

您应始终使用资源管理器而不是直接读取文件以确保考虑全球化.

using System.Collections;
using System.Globalization;
using System.Resources;

...


        ResourceManager MyResourceClass = new ResourceManager(typeof(Resources /* Reference to your resources class -- may be named differently in your case */));

ResourceSet resourceSet = MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
    string resourceKey = entry.Key.ToString();
    object resource = entry.Value;
}
Run Code Online (Sandbox Code Playgroud)

  • 我花了一点时间才发现你需要这一行来声明MyResourceClass.`ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName",System.Reflection.Assembly.Load("App_GlobalResources"));` (12认同)
  • @JoeFletch:它不需要这一行.代码直接调用资源文件.示例:我有一个名为PageList.resx的文件,然后我将调用:ResourceSet resourceSet = PageList.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture,true,true); (6认同)
  • JoeFletch的路线实际上帮助了我.我在另一个C#项目中有一个resx,所以他的行允许我调用那个dll程序集并以这种方式加载资源.此外,当我试图在我的代码中包含PageList时,它为PageList.ResourceManager引发了一个错误.说"PageList不包含ResourceManager的定义".最后,字符串resourceKey = entry.Key抛出一个错误,我改为使用"object resourceKey = entry.Key" (3认同)
  • 根据您的资源中是否确实定义了文化,您必须切换到CultureInfo.InvariantCulture.这里我使用的是库中的资源,而不是WinForms应用程序. (2认同)

Svi*_*ish 26

在我的博客上发表了关于它的博文 :)简短的版本是,找到资源的全名(除非你已经知道它们):

var assembly = Assembly.GetExecutingAssembly();

foreach (var resourceName in assembly.GetManifestResourceNames())
    System.Console.WriteLine(resourceName);
Run Code Online (Sandbox Code Playgroud)

要将所有这些用于某些事情:

foreach (var resourceName in assembly.GetManifestResourceNames())
{
    using(var stream = assembly.GetManifestResourceStream(resourceName))
    {
        // Do something with stream
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用除执行程序之外的其他程序集中的资源,您只需使用Assembly该类的其他一些静态方法获取不同的程序集对象.希望能帮助到你 :)


rah*_*hul 9

使用ResXResourceReader类

ResXResourceReader rsxr = new ResXResourceReader("your resource file path");

// Iterate through the resources and display the contents to the console.
foreach (DictionaryEntry d in rsxr)
{
    Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
}
Run Code Online (Sandbox Code Playgroud)


小智 7

  // Create a ResXResourceReader for the file items.resx.
  ResXResourceReader rsxr = new ResXResourceReader("items.resx");

  // Create an IDictionaryEnumerator to iterate through the resources.
  IDictionaryEnumerator id = rsxr.GetEnumerator();       

  // Iterate through the resources and display the contents to the console.
  foreach (DictionaryEntry d in rsxr) 
  {
Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
  }

 //Close the reader.
 rsxr.Close();
Run Code Online (Sandbox Code Playgroud)

看链接:微软的例子

  • 请注意,此类位于`System.Windows.Forms`程序集中,如果您使用的是MVC应用程序,则不会自动添加该类 (4认同)

Abe*_*bel 6

在将资源.RESX文件添加到项目中的那一刻,Visual Studio将创建一个具有相同名称的Designer.cs,为您创建一个类,并将资源的所有项目作为静态属性.在键入资源文件的名称后,在编辑器中键入点时,可以看到资源的所有名称.

或者,您可以使用反射循环遍历这些名称.

Type resourceType = Type.GetType("AssemblyName.Resource1");
PropertyInfo[] resourceProps = resourceType.GetProperties(
    BindingFlags.NonPublic | 
    BindingFlags.Static | 
    BindingFlags.GetProperty);

foreach (PropertyInfo info in resourceProps)
{
    string name = info.Name;
    object value = info.GetValue(null, null);  // object can be an image, a string whatever
    // do something with name and value
}
Run Code Online (Sandbox Code Playgroud)

显然,只有当RESX文件在当前程序集或项目的范围内时,此方法才可用.否则,请使用"pulse"提供的方法.

此方法的优点是您可以调用已为您提供的实际属性,并根据需要考虑任何本地化.但是,它相当多余,因为通常您应该使用类型安全的直接方法来调用资源的属性.

  • 为什么在有ResourceSet可用时使用反射? (2认同)