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

有没有办法循环在C#中的.resx文件中的所有资源?

您应该始终使用资源pipe理器,而不是直接读取文件以确保全球化得到考虑。

 using System.Collections; using System.Globalization; using System.Resources; ... ResourceSet resourceSet = MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true); foreach (DictionaryEntry entry in resourceSet) { string resourceKey = entry.Key.ToString(); object resource = entry.Value; } 

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

 var assembly = Assembly.GetExecutingAssembly(); foreach (var resourceName in assembly.GetManifestResourceNames()) System.Console.WriteLine(resourceName); 

要使用所有的东西:

 foreach (var resourceName in assembly.GetManifestResourceNames()) { using(var stream = assembly.GetManifestResourceStream(resourceName)) { // Do something with stream } } 

要使用其他程序集中的资源而不是正在执行的资源,只需使用Assembly类的其他静态方法即可获得不同的程序集对象。 希望它有助于:)

使用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()); } 
  // 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(); 

看到链接: 微软的例子

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

或者,您可以使用reflection循环这些名称。

 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 } 

当RESX文件在当前程序集或项目的范围内时,这种方法显然是可用的。 否则,使用“脉冲”提供的方法。

这种方法的优点是,如果你愿意,你可以调用已经提供给你的实际属性,考虑到任何本地化。 然而,这是相当多余的,通常你应该使用types安全的直接方法来调用资源的属性。

您可以使用ResourceManager.GetResourceSet 。

使用LINQ to SQL :

 XDocument .Load(resxFileName) .Descendants() .Where(_ => _.Name == "data") .Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}"); 

如果你想使用LINQ,使用resourceSet.OfType<DictionaryEntry>() 。 例如,使用LINQ可以根据索引(int)而不是键(string)来select资源:

 ResourceSet resourceSet = Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true); foreach (var entry in resourceSet.OfType<DictionaryEntry>().Select((item, i) => new { Index = i, Key = item.Key, Value = item.Value })) { Console.WriteLine(@"[{0}] {1}", entry.Index, entry.Key); }