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 文件中的资源。 首先, ResXResourceReaderrsxr 为文件 items.resx创建 。 接下来, 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 类通过遍历 字典枚举器 (IDictionaryEnumerator 方法返回 GetEnumerator 的) 来枚举 .resx 文件中的资源。 调用 提供 IDictionaryEnumerator 的方法可转到下一个资源,并读取 .resx 文件中每个资源的名称和值。

注意

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

下面的示例使用 GetEnumerator 方法获取 IDictionaryEnumerator 对象,该对象用于枚举 .resx 文件中的资源。 该示例包括创建 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,则属性ResXDataNodeIDictionaryEnumerator.Value值为 对象而不是资源值。 这使资源项的注释可从 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

适用于

另请参阅