如何在 C# 中遍历 Resources.resx?

How to iterate over Resources.resx in C#?

我想在 C# 中访问许多文件,但如果不对路径进行硬编码,我就无法成功完成此操作。我不想指定一个确切的路径,因为程序应该独立于它的位置工作。
我想我应该通过将文件添加到资源来做到这一点,但我找不到如何迭代这些文件。我找到了几页关于阅读 .resx 的内容,但似乎所有内容要么只解决了按名称访问一个特定资源的问题,要么使用了硬编码路径。
我目前的代码如下:

ResXResourceReader resourcesreader = new ResXResourceReader(Properties.Resources);

这会导致编译器错误“'Resources' 是一种类型,在给定的上下文中无效”。

当我对路径进行硬编码时,奇怪的是,我在运行时遇到错误。

ResXResourceReader resourcesreader = new ResXResourceReader(@"G:\Programming\C#\Contest Judging\Contest Judging\Properties\Resources.resx");
foreach (DictionaryEntry image in resourcesreader)

最后一行抛出异常:

System.ArgumentException
  ResX file Could not find a part of the path 'G:\Programming\C#\Contest Judging\Contest Judging\bin\Resources\BugsyWPfeiffer 1.png'. Line 123, position 5. cannot be parsed.

Inner Exception 1:
XmlException: Could not find a part of the path 'G:\Programming\C#\Contest Judging\Contest Judging\bin\Resources\BugsyWPfeiffer 1.png'. Line 123, position 5.

Inner Exception 2:
DirectoryNotFoundException: Could not find a part of the path 'G:\Programming\C#\Contest Judging\Contest Judging\bin\Resources\BugsyWPfeiffer 1.png'.

我想知道为什么它开始在 bin\ 中查找,因为我通过 Resources.resx 按了 Ctrl + F 但它没有出现。

您可以通过从生成的 Resources class:

中获取 ResourceManager 来完成此操作
// Change this if you want to use fetch the resources for a specific culture
var culture = CultureInfo.InvariantCulture;

var resourceManager = Properties.Resources.ResourceManager;
var resourceSet = resourceManager.GetResourceSet(culture, createIfNotExists: true, tryParents: true);
foreach (DictionaryEntry entry in resourceSet)
{
    Console.WriteLine($"{entry.Key}: {entry.Value}");
}

资源被编译到您的应用程序(或附属程序集)中,因此没有 resx 文件供您加载。