Enumerates the resources in a binary resources (.resources) file by reading sequential resource name/value pairs.
See Also: ResourceReader Members
The System.Resources.ResourceReader class provides a standard implementation of the System.Resources.IResourceReader interface. A System.Resources.ResourceReader instance represents either a standalone .resources file or a .resources file that is embedded in an assembly. It is used to enumerate the resources in a .resources file and retrieve its name/value pairs. It differs from the System.Resources.ResourceManager class, which is used to retrieve specified named resources from a .resources file that is embedded in an assembly. The System.Resources.ResourceManager class is used to retrieve resources whose names are known in advance, whereas the System.Resources.ResourceReader class is useful for retrieving resources whose number or precise names are not known at compile time. For example, an application may use a resources file to store configuration information that is organized into sections and items in a section, where the number of sections or items in a section is not known in advance. Resources can then be named generically (such as Section1, Section1Item1, Section1Item2, and so on) and retrieved by using a System.Resources.ResourceReader object.
For more information about using the System.Resources.ResourceReader class, see the following sections:
A .resources file is a binary file that has been compiled from either a text file or an XML .resx file by Resgen.exe (Resource File Generator). A System.Resources.ResourceReader object can represent either a standalone .resources file or a .resources file that has been embedded in an assembly.
To instantiate a System.Resources.ResourceReader object that reads from a standalone .resources file, use the System.Resources.ResourceReader class constructor with either an input stream or a string that contains the .resources file name. The following example illustrates both approaches. The first instantiates a System.Resources.ResourceReader object that represents a .resources file named Resources1.resources by using its file name. The second instantiates a System.Resources.ResourceReader object that represents a .resources file named Resources2.resources by using a stream created from the file.
code reference: System.Resources.ResourceReader.Class#2
To create a System.Resources.ResourceReader object that represents an embedded .resources file, instantiate an System.Reflection.Assembly object from the assembly in which the .resources file is embedded. Its System.Reflection.Assembly.GetManifestResourceStream(Type, string) method returns a System.IO.Stream object that can be passed to the ResourceReader.#ctor(System.IO.Stream) constructor. The following example instantiates a System.Resources.ResourceReader object that represents an embedded .resources file.
code reference: System.Resources.ResourceReader.Class#3
To enumerate the resources in a .resources file, you call the ResourceReader.GetEnumerator method, which returns an IDictionaryEnumerator object. You call the IDictionaryEnumerator.MoveNext method to move from one resource to the next. The method returns false when all the resources in the .resources file have been enumerated.
Although the System.Resources.ResourceReader class implements the IEnumerable interface and the IEnumerable.GetEnumerator method, the ResourceReader.GetEnumerator method does not provide the IEnumerable.GetEnumerator implementation. Instead, the ResourceReader.GetEnumerator method returns an IDictionaryEnumerator interface object that provides access to each resource's name/value pair.
You can retrieve the individual resources in the collection in two ways:
You can iterate each resource in the IDictionaryEnumerator collection and use IDictionaryEnumerator properties to retrieve the resource name and value. We recommend this technique when all the resources are of the same type, or you know the data type of each resource.
You can retrieve the name of each resource when you iterate the IDictionaryEnumerator collection and call the ResourceReader.GetResourceData(string, String@, Byte@) method to retrieve the resource's data. We recommend this approach when you do not know the data type of each resource or if the previous approach throws exceptions.
The first method of enumerating the resources in a .resources file involves directly retrieving each resource's name/value pair. After you call the IDictionaryEnumerator.MoveNext method to move to each resource in the collection, you can retrieve the resource name from the IDictionaryEnumerator.Key property and the resource data from the IDictionaryEnumerator.Value property.
The following example shows how to retrieve the name and value of each resource in a .resources file by using the IDictionaryEnumerator.Key and IDictionaryEnumerator.Value properties. To run the example, create the following text file named ApplicationResources.txt to define string resources.
Title="Contact Information" Label1="First Name:" Label2="Middle Name:" Label3="Last Name:" Label4="SSN:" Label5="Street Address:" Label6="City:" Label7="State:" Label8="Zip Code:" Label9="Home Phone:" Label10="Business Phone:" Label11="Mobile Phone:" Label12="Other Phone:" Label13="Fax:" Label14="Email Address:" Label15="Alternate Email Address:"
You can then convert the text resource file to a binary file named ApplicationResources.resources by using the following command:
The following example then uses the System.Resources.ResourceReader class to enumerate each resource in the standalone binary .resources file and to display its key name and corresponding value.
code reference: System.Resources.ResourceReader.Class#1
The attempt to retrieve resource data from the IDictionaryEnumerator.Value property can throw the following exceptions:
A FormatException if the data is not in the expected format.
A System.IO.FileNotFoundException if the assembly that contains the type to which the data belongs cannot be found.
A TypeLoadException if the type to which the data belongs cannot be cannot be found.
Typically, these exceptions are thrown if the .resources file has been modified manually, if the assembly in which a type is defined has either not been included with an application or has been inadvertently deleted, or if the assembly is an older version that predates a type. If one of these exceptions is thrown, you can retrieve resources by enumerating each resource and calling the ResourceReader.GetResourceData(string, String@, Byte@) method, as the following section shows. This approach provides you with some information about the data type that the IDictionaryEnumerator.Value property attempted to return.
The second approach to enumerating resources in a .resources file also involves navigating through the resources in the file by calling the IDictionaryEnumerator.MoveNext method. For each resource, you retrieve the resource's name from the IDictionaryEnumerator.Key property, which is then passed to the ResourceReader.GetResourceData(string, String@, Byte@) method to retrieve the resource's data. This is returned as a byte array in the resourceData argument.
This approach is more awkward than retrieving the resource name and value from the IDictionaryEnumerator.Key and IDictionaryEnumerator.Value properties, because it returns the actual bytes that form the resource value. However, if the attempt to retrieve the resource throws an exception, the ResourceReader.GetResourceData(string, String@, Byte@) method can help identify the source of the exception by supplying information about the resource's data type. For more information about the string that indicates the resource's data type, see ResourceReader.GetResourceData(string, String@, Byte@).
The following example illustrates how to use this approach to retrieve resources and to handle any exceptions that are thrown. It programmatically creates a binary .resources file that contains four strings, one Boolean, one integer, one bitmap, and one custom DateTimeTZI object. To run the example, do the following:[The 'ordered' type of list has not been implemented in the ECMA stylesheet.]