ResXResourceReader 类

定义

枚举 XML 资源(.resx)文件和流,并读取顺序资源名称和值对。

public ref class ResXResourceReader : System::Resources::IResourceReader
public ref class ResXResourceReader : IDisposable, System::Collections::IEnumerable, System::Resources::IResourceReader
public class ResXResourceReader : System.Resources.IResourceReader
public class ResXResourceReader : IDisposable, System.Collections.IEnumerable, System.Resources.IResourceReader
type ResXResourceReader = class
    interface IResourceReader
    interface IEnumerable
    interface IDisposable
Public Class ResXResourceReader
Implements IResourceReader
Public Class ResXResourceReader
Implements IDisposable, IEnumerable, IResourceReader
继承
ResXResourceReader
实现

示例

以下示例演示如何使用 ResXResourceReader 循环访问 .resx 文件中的资源。 首先,为文件 items.resx创建 ResXResourceReaderrsxr。 接下来,GetEnumerator 方法用于创建一个 IDictionaryEnumerator 来循环访问资源并向控制台显示内容。

#using <system.windows.forms.dll>
#using <System.dll>

using namespace System;
using namespace System::Resources;
using namespace System::Collections;
void main()
{

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


   // Iterate through the resources and display the contents to the console.
   IEnumerator^ myEnum = rsxr->GetEnumerator();
   while ( myEnum->MoveNext() )
   {
      DictionaryEntry^ d = safe_cast<DictionaryEntry^>(myEnum->Current);
      Console::WriteLine( "{0}:\t {1}", d->Key, d->Value );
   }


   //Close the reader.
   rsxr->Close();
}
using System;
using System.Resources;
using System.Collections;

class ReadResXResources
{
   public static void Main()
   {

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

      // 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();
   }
}
Imports System.Resources
Imports System.Collections

Class ReadResXResources
   
   Public Shared Sub Main()
      
      ' Create a ResXResourceReader for the file items.resx.
      Dim rsxr As ResXResourceReader
      rsxr = New ResXResourceReader("items.resx")

      ' Iterate through the resources and display the contents to the console.
      Dim d As DictionaryEntry
      For Each d In  rsxr
         Console.WriteLine(d.Key.ToString() + ":" + ControlChars.Tab + d.Value.ToString())
      Next d
      
      'Close the reader.
      rsxr.Close()

   End Sub

End Class

注解

重要

从此类调用不受信任的数据的方法是一种安全风险。 仅使用受信任的数据从此类调用方法。 有关详细信息,请参阅 验证所有输入

ResXResourceReader 类提供 IResourceReader 接口的默认实现,该接口以 XML 格式读取资源信息。 若要从二进制资源格式读取资源信息,请使用 ResourceReader 类。

使用 ResXResourceReader 类通过遍历 GetEnumerator 方法返回的字典枚举器(IDictionaryEnumerator)来枚举 .resx 文件中的资源。 调用 IDictionaryEnumerator 提供的方法以前进到下一个资源,并读取 .resx 文件中每个资源的名称和值。

注意

ResXResourceReader 类提供两个枚举器。 ResXResourceReader.GetEnumerator 方法返回 IDictionaryEnumerator 对象;建议使用此方法枚举资源。 ResXResourceReader.IEnumerable.GetEnumerator 方法是返回 IEnumerator 对象的显式接口实现;我们不建议使用它。

以下示例使用 GetEnumerator 方法获取用于枚举 .resx 文件中资源的 IDictionaryEnumerator 对象。 该示例包括一个创建必要资源文件的 CreateResourceFile 例程。

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

public class Example
{
   private const string resxFilename = @".\CountryHeaders.resx";
    
   public static void Main()
   {
      // Create a resource file to read.
      CreateResourceFile();
      
      // Enumerate the resources in the file.
      ResXResourceReader rr = new ResXResourceReader(resxFilename);
      IDictionaryEnumerator dict = rr.GetEnumerator();
      while (dict.MoveNext())
         Console.WriteLine("{0}: {1}", dict.Key, dict.Value);   
   }

   private static void CreateResourceFile()
   {
      ResXResourceWriter rw = new ResXResourceWriter(resxFilename);
      string[] resNames = {"Country", "Population", "Area", 
                           "Capital", "LCity" };
      string[] columnHeaders = { "Country Name", "Population (2010}", 
                                 "Area", "Capital", "Largest City" };
      string[] comments = { "The localized country name", "", 
                            "The area in square miles", "", 
                            "The largest city based on 2010 data" };
      rw.AddResource("Title", "Country Information");
      rw.AddResource("nColumns", resNames.Length);
      for (int ctr = 0; ctr < resNames.Length; ctr++) {
         ResXDataNode node = new ResXDataNode(resNames[ctr], columnHeaders[ctr]);
         node.Comment = comments[ctr];
         rw.AddResource(node);
      }
      rw.Generate();
      rw.Close();
   }
}
// The example displays the following output:
//       Title: Country Information
//       nColumns: 5
//       Country: Country Name
//       Population: Population (2010}
//       Area: Area
//       Capital: Capital
//       LCity: Largest City
Imports System.Collections
Imports System.Resources

Module Example
   Private Const resxFilename As String = ".\CountryHeaders.resx"
     
   Public Sub Main()
      ' Create a resource file to read.
      CreateResourceFile()
      
      ' Enumerate the resources in the file.
      Dim rr As New ResXResourceReader(resxFilename)
      Dim dict As IDictionaryEnumerator = rr.GetEnumerator()
      Do While dict.MoveNext()
         Console.WriteLine("{0}: {1}", dict.Key, dict.Value)   
      Loop
   End Sub
   
   Private Sub CreateResourceFile()
      Dim rw As New ResxResourceWriter(resxFilename)
      Dim resNames() As String = {"Country", "Population", "Area", 
                                  "Capital", "LCity" }
      Dim columnHeaders() As String = { "Country Name", "Population (2010}", 
                                        "Area", "Capital", "Largest City" }
      Dim comments() As String = { "The localized country name", "", 
                                   "The area in square miles", "", 
                                   "The largest city based on 2010 data" }
      rw.AddResource("Title", "Country Information")
      rw.AddResource("nColumns", resNames.Length)
      For ctr As Integer = 0 To resNames.Length - 1
         Dim node As New ResXDataNode(resNames(ctr), columnHeaders(ctr))
         node.Comment = comments(ctr)
         rw.AddResource(node)
      Next
      rw.Generate()
      rw.Close()
   End Sub
End Module
' The example displays the following output:
'       Title: Country Information
'       nColumns: 5
'       Country: Country Name
'       Population: Population (2010}
'       Area: Area
'       Capital: Capital
'       LCity: Largest City

如果 UseResXDataNodes 属性 true,则 IDictionaryEnumerator.Value 属性的值是 ResXDataNode 对象,而不是资源值。 这使资源项的注释可从 ResXDataNode.Comment 属性获取。 以下示例将 UseResXDataNodes 属性设置为 true 并枚举 .resx 文件中的资源,

using System;
using System.Collections;
using System.ComponentModel.Design;
using System.Resources;

public class Example
{
   private const string resxFilename = @".\CountryHeaders.resx";
    
   public static void Main()
   {
      // Create a resource file to read.
      CreateResourceFile();
      
      // Enumerate the resources in the file.
      ResXResourceReader rr = new ResXResourceReader(resxFilename);
      rr.UseResXDataNodes = true;
      IDictionaryEnumerator dict = rr.GetEnumerator();
      while (dict.MoveNext()) {
         ResXDataNode node = (ResXDataNode) dict.Value;
         Console.WriteLine("{0,-20} {1,-20} {2}", 
                           node.Name + ":", 
                           node.GetValue((ITypeResolutionService) null), 
                           ! String.IsNullOrEmpty(node.Comment) ? "// " + node.Comment : "");
      }
   }

   private static void CreateResourceFile()
   {
      ResXResourceWriter rw = new ResXResourceWriter(resxFilename);
      string[] resNames = {"Country", "Population", "Area", 
                           "Capital", "LCity" };
      string[] columnHeaders = { "Country Name", "Population (2010}", 
                                 "Area", "Capital", "Largest City" };
      string[] comments = { "The localized country name", "", 
                            "The area in square miles", "", 
                            "The largest city based on 2010 data" };
      rw.AddResource("Title", "Country Information");
      rw.AddResource("nColumns", resNames.Length);
      for (int ctr = 0; ctr < resNames.Length; ctr++) {
         ResXDataNode node = new ResXDataNode(resNames[ctr], columnHeaders[ctr]);
         node.Comment = comments[ctr];
         rw.AddResource(node);
      }
      rw.Generate();
      rw.Close();
   }
}
// The example displays the following output:
//    Title:               Country Information
//    nColumns:            5
//    Country:             Country Name         // The localized country name
//    Population:          Population (2010}
//    Area:                Area                 // The area in square miles
//    Capital:             Capital
//    LCity:               Largest City         // The largest city based on 2010 data
Imports System.Collections
Imports System.ComponentModel.Design
Imports System.Resources

Module Example
   Private Const resxFilename As String = ".\CountryHeaders.resx"
     
   Public Sub Main()
      ' Create a resource file to read.
      CreateResourceFile()
      
      ' Enumerate the resources in the file.
      Dim rr As New ResXResourceReader(resxFilename)
      rr.UseResXDataNodes = True
      Dim dict As IDictionaryEnumerator = rr.GetEnumerator()
      Do While dict.MoveNext()
         Dim node As ResXDataNode = DirectCast(dict.Value, ResXDataNode)
         Console.WriteLine("{0,-20} {1,-20} {2}", 
                           node.Name + ":", 
                           node.GetValue(CType(Nothing, ITypeResolutionService)), 
                           If(Not String.IsNullOrEmpty(node.Comment), "// " + node.Comment, ""))
      Loop
   End Sub
   
   Private Sub CreateResourceFile()
      Dim rw As New ResxResourceWriter(resxFilename)
      Dim resNames() As String = {"Country", "Population", "Area", 
                                  "Capital", "LCity" }
      Dim columnHeaders() As String = { "Country Name", "Population (2010}", 
                                        "Area", "Capital", "Largest City" }
      Dim comments() As String = { "The localized country name", "", 
                                   "The area in square miles", "", 
                                   "The largest city based on 2010 data" }
      rw.AddResource("Title", "Country Information")
      rw.AddResource("nColumns", resNames.Length)
      For ctr As Integer = 0 To resNames.Length - 1
         Dim node As New ResXDataNode(resNames(ctr), columnHeaders(ctr))
         node.Comment = comments(ctr)
         rw.AddResource(node)
      Next
      rw.Generate()
      rw.Close()
   End Sub
End Module
' The example displays the following output:
'    Title:               Country Information
'    nColumns:            5
'    Country:             Country Name         // The localized country name
'    Population:          Population (2010}
'    Area:                Area                 // The area in square miles
'    Capital:             Capital
'    LCity:               Largest City         // The largest city based on 2010 data

如果 UseResXDataNodestrue,则枚举中的 ResXDataNode 项可以是:

  • 命名资源及其数据。 在本例中,ResXDataNode.FileRef 属性 null

  • 命名资源以及包含资源数据的文件的名称。 在这种情况下,ResXDataNode.FileRef 属性返回一个 ResXFileRef 对象,该对象提供有关资源的信息,包括其文件名。 如果使用相对文件名,应始终设置 BasePath 属性来提供相对文件路径的引用点。

如果要从 .resx 文件检索命名资源,而不是枚举其资源,可以实例化 ResXResourceSet 对象并调用其 GetStringGetObject 方法。

注意

ResXResourceReader 类包含应用于所有成员的类级别的链接需求和继承需求。 当直接调用方或派生类没有完全信任权限时,将引发 SecurityException 异常。

构造函数

ResXResourceReader(Stream)

初始化指定流的 ResXResourceReader 类的新实例。

ResXResourceReader(Stream, AssemblyName[])

使用流和程序集名称数组初始化 ResXResourceReader 类的新实例。

ResXResourceReader(Stream, ITypeResolutionService)

使用输入流和类型解析服务初始化 ResXResourceReader 类的新实例。

ResXResourceReader(String)

为指定的资源文件初始化 ResXResourceReader 类的新实例。

ResXResourceReader(String, AssemblyName[])

使用 XML 资源文件名和程序集名称数组初始化 ResXResourceReader 类的新实例。

ResXResourceReader(String, ITypeResolutionService)

使用文件名和类型解析服务初始化 ResXResourceReader 类的新实例。

ResXResourceReader(TextReader)

为指定的 TextReader初始化 ResXResourceReader 类的新实例。

ResXResourceReader(TextReader, AssemblyName[])

使用 TextReader 对象和程序集名称数组初始化 ResXResourceReader 类的新实例。

ResXResourceReader(TextReader, ITypeResolutionService)

使用文本流读取器和类型解析服务初始化 ResXResourceReader 类的新实例。

属性

BasePath

获取或设置 ResXFileRef 对象中指定的相对文件路径的基路径。

UseResXDataNodes

获取或设置一个值,该值指示读取当前 XML 资源文件或流时是否返回 ResXDataNode 对象。

方法

Close()

释放 ResXResourceReader使用的所有资源。

Dispose(Boolean)

释放 ResXResourceReader 使用的非托管资源,并选择性地释放托管资源。

Equals(Object)

确定指定的对象是否等于当前对象。

(继承自 Object)
Finalize()

此成员替代 Finalize() 方法。

FromFileContents(String)

创建一个新的 ResXResourceReader 对象并将其初始化为读取其内容为 XML 资源文件形式的字符串。

FromFileContents(String, AssemblyName[])

创建一个新的 ResXResourceReader 对象并初始化它以读取其内容为 XML 资源文件形式的字符串,并使用 AssemblyName 对象的数组解析资源中指定的类型名称。

FromFileContents(String, ITypeResolutionService)

创建一个新的 ResXResourceReader 对象并初始化它以读取其内容为 XML 资源文件形式的字符串,并使用 ITypeResolutionService 对象解析资源中指定的类型名称。

GetEnumerator()

返回当前 ResXResourceReader 对象的枚举数。

GetHashCode()

用作默认哈希函数。

(继承自 Object)
GetMetadataEnumerator()

提供一个字典枚举器,该枚举器可以从当前的 XML 资源文件或流中检索设计时属性。

GetType()

获取当前实例的 Type

(继承自 Object)
MemberwiseClone()

创建当前 Object的浅表副本。

(继承自 Object)
ToString()

返回一个表示当前对象的字符串。

(继承自 Object)

显式接口实现

IDisposable.Dispose()

释放 ResXResourceReader 使用的非托管资源,并选择性地释放托管资源。 有关此成员的说明,请参阅 Dispose() 方法。

IEnumerable.GetEnumerator()

返回当前 ResXResourceReader 对象的枚举数。 有关此成员的说明,请参阅 GetEnumerator() 方法。

扩展方法

Cast<TResult>(IEnumerable)

IEnumerable 的元素强制转换为指定类型。

OfType<TResult>(IEnumerable)

根据指定类型筛选 IEnumerable 的元素。

AsParallel(IEnumerable)

启用查询的并行化。

AsQueryable(IEnumerable)

IEnumerable 转换为 IQueryable

适用于

另请参阅