ResourceManager.GetObject 方法
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
返回为当前区域性的指定非字符串资源的值。
重载
GetObject(String) |
返回指定的非字符串资源的值。 |
GetObject(String, CultureInfo) |
获取为指定区域性本地化的指定非字符串资源的值。 |
GetObject(String)
返回指定的非字符串资源的值。
public:
virtual System::Object ^ GetObject(System::String ^ name);
public virtual object? GetObject (string name);
public virtual object GetObject (string name);
abstract member GetObject : string -> obj
override this.GetObject : string -> obj
Public Overridable Function GetObject (name As String) As Object
参数
- name
- String
要获取的资源名。
返回
针对调用方的当前区域性设置而本地化的资源的值。 如果相应的资源集存在,但无法找到 name
,该方法返回 null
。
例外
name
参数为 null
。
未找到可用的本地资源集,并且没有默认区域性资源。 有关如何处理此异常的信息,请参阅 ResourceManager 类主题“处理 MissingManifestResourceException 和 MissingSatelliteAssemblyException 异常”一节。
默认区域性的资源位于无法找到的附属程序集。 有关如何处理此异常的信息,请参阅 ResourceManager 类主题“处理 MissingManifestResourceException 和 MissingSatelliteAssemblyException 异常”一节。
示例
下面的示例使用 GetObject(String) 方法反序列化一个自定义对象。 如果使用定义名为 的以下结构的 PersonTable
Visual Basic) ,则此示例包含名为 UIElements.cs (UIElements.vb 的源代码文件。 此结构应由显示表列的本地化名称的常规表显示例程使用。 请注意, PersonTable
结构标有 SerializableAttribute 属性。
using System;
[Serializable] public struct PersonTable
{
public readonly int nColumns;
public readonly string column1;
public readonly string column2;
public readonly string column3;
public readonly int width1;
public readonly int width2;
public readonly int width3;
public PersonTable(string column1, string column2, string column3,
int width1, int width2, int width3)
{
this.column1 = column1;
this.column2 = column2;
this.column3 = column3;
this.width1 = width1;
this.width2 = width2;
this.width3 = width3;
this.nColumns = typeof(PersonTable).GetFields().Length / 2;
}
}
<Serializable> Public Structure PersonTable
Public ReadOnly nColumns As Integer
Public Readonly column1 As String
Public ReadOnly column2 As String
Public ReadOnly column3 As String
Public ReadOnly width1 As Integer
Public ReadOnly width2 As Integer
Public ReadOnly width3 As Integer
Public Sub New(column1 As String, column2 As String, column3 As String,
width1 As Integer, width2 As Integer, width3 As Integer)
Me.column1 = column1
Me.column2 = column2
Me.column3 = column3
Me.width1 = width1
Me.width2 = width2
Me.width3 = width3
Me.nColumns = Me.GetType().GetFields().Count \ 2
End Sub
End Structure
下面的代码来自名为 CreateResources.cs(对于 Visual Basic 则为 CreateResources.vb)的文件,该代码创建一个名为 UIResources.resx 的 XML 资源文件,该文件存储有表标题和包含已针对英语语言本地化的应用的信息的 PersonTable
对象。
using System;
using System.Resources;
public class CreateResource
{
public static void Main()
{
PersonTable table = new PersonTable("Name", "Employee Number",
"Age", 30, 18, 5);
ResXResourceWriter rr = new ResXResourceWriter(@".\UIResources.resx");
rr.AddResource("TableName", "Employees of Acme Corporation");
rr.AddResource("Employees", table);
rr.Generate();
rr.Close();
}
}
Imports System.Resources
Module CreateResource
Public Sub Main()
Dim table As New PersonTable("Name", "Employee Number", "Age", 30, 18, 5)
Dim rr As New ResXResourceWriter(".\UIResources.resx")
rr.AddResource("TableName", "Employees of Acme Corporation")
rr.AddResource("Employees", table)
rr.Generate()
rr.Close()
End Sub
End Module
下面的代码位于名为 GetObject.cs (GetObject.vb) 的源代码文件中,然后检索资源并将其显示在控制台上。
using System;
using System.Resources;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example
{
public static void Main()
{
string fmtString = String.Empty;
ResourceManager rm = new ResourceManager("UIResources", typeof(Example).Assembly);
string title = rm.GetString("TableName");
PersonTable tableInfo = (PersonTable) rm.GetObject("Employees");
if (! String.IsNullOrEmpty(title)) {
fmtString = "{0," + ((Console.WindowWidth + title.Length) / 2).ToString() + "}";
Console.WriteLine(fmtString, title);
Console.WriteLine();
}
for (int ctr = 1; ctr <= tableInfo.nColumns; ctr++) {
string columnName = "column" + ctr.ToString();
string widthName = "width" + ctr.ToString();
string value = tableInfo.GetType().GetField(columnName).GetValue(tableInfo).ToString();
int width = (int) tableInfo.GetType().GetField(widthName).GetValue(tableInfo);
fmtString = "{0,-" + width.ToString() + "}";
Console.Write(fmtString, value);
}
Console.WriteLine();
}
}
Imports System.Resources
<Assembly: NeutralResourcesLanguageAttribute("en")>
Module Example
Public Sub Main()
Dim fmtString As String = String.Empty
Dim rm As New ResourceManager("UIResources", GetType(Example).Assembly)
Dim title As String = rm.GetString("TableName")
Dim tableInfo As PersonTable = DirectCast(rm.GetObject("Employees"), PersonTable)
If Not String.IsNullOrEmpty(title) Then
fmtString = "{0," + ((Console.WindowWidth + title.Length) \ 2).ToString() + "}"
Console.WriteLine(fmtString, title)
Console.WriteLine()
End If
For ctr As Integer = 1 To tableInfo.nColumns
Dim columnName As String = "column" + ctr.ToString()
Dim widthName As String = "width" + ctr.ToString()
Dim value As String = CStr(tableInfo.GetType().GetField(columnName).GetValue(tableInfo))
Dim width As Integer = CInt(tableInfo.GetType().GetField(widthName).GetValue(tableInfo))
fmtString = "{0,-" + width.ToString() + "}"
Console.Write(fmtString, value)
Next
Console.WriteLine()
End Sub
End Module
可以生成必要的资源文件和程序集,并通过执行以下批处理文件运行该应用。 必须使用 /r
选项提供具有对 UIElements.dll 的引用的 Resgen.exe,以便其能够访问有关 PersonTable
结构的信息。 如果使用 C#,请将 vbc
编译器名称替换为 csc
,并将 .vb
扩展名替换为 .cs
。
vbc /t:library UIElements.vb
vbc CreateResources.vb /r:UIElements.dll
CreateResources
resgen UIResources.resx /r:UIElements.dll
vbc GetObject.vb /r:UIElements.dll /resource:UIResources.resources
GetObject.exe
注解
方法 GetObject 用于检索非字符串资源。 其中包括属于基元数据类型(如 Int32 或 Double)的值,位图 (例如 System.Drawing.Bitmap 对象) 或自定义序列化对象。 通常,返回的对象必须在 C#) 中 (强制转换,或者在 Visual Basic) 中将 (转换为相应类型的对象。
返回的资源针对当前线程的 UI 区域性进行本地化,该区域性由 CultureInfo.CurrentUICulture 属性定义。 如果资源未针对该区域性进行本地化,则资源管理器使用回退规则来加载相应的资源。 如果未找到一组可用本地化资源,则 ResourceManager 回退到默认区域性的资源上。 如果未找到默认区域性的资源集,该方法将 MissingManifestResourceException 引发异常,或者如果资源集预期驻留在附属程序集中,则引发 MissingSatelliteAssemblyException 异常。 如果资源管理器可以加载适当的资源集,但找不到名为 name
的资源,该方法将 null
返回 。
属性 IgnoreCase 确定 与资源名称的比较 name
是不区分大小写还是区分大小写, (默认) 。
注意
此方法引发的异常数可能多于所列的异常数。 发生这种情况的一个原因是此方法调用的方法引发异常。 例如, FileLoadException 如果部署或安装附属程序集时出错,可能会引发异常; SerializationException 如果反序列化类型时用户定义的类型引发用户定义的异常,则可能会引发异常。
性能注意事项
如果使用同name
一参数多次调用 GetObject 方法,请不要依赖于每次调用时返回对同一对象的引用的方法。 这是因为 方法 GetObject 可以返回对缓存中现有资源对象的引用,也可以重新加载资源并返回对新资源对象的引用。
另请参阅
适用于
GetObject(String, CultureInfo)
获取为指定区域性本地化的指定非字符串资源的值。
public:
virtual System::Object ^ GetObject(System::String ^ name, System::Globalization::CultureInfo ^ culture);
public virtual object? GetObject (string name, System.Globalization.CultureInfo? culture);
public virtual object GetObject (string name, System.Globalization.CultureInfo culture);
abstract member GetObject : string * System.Globalization.CultureInfo -> obj
override this.GetObject : string * System.Globalization.CultureInfo -> obj
Public Overridable Function GetObject (name As String, culture As CultureInfo) As Object
参数
- name
- String
要获取的资源名。
- culture
- CultureInfo
要针对其本地化资源的区域性。 如果资源未本地化为此区域性,则资源管理器使用回退规则找到适当的资源。
如果此值为 null
,则 CultureInfo 对象使用 CurrentUICulture 属性来获取。
返回
为指定区域性本地化的资源的值。 如果相应的资源集存在,但无法找到 name
,该方法返回 null
。
例外
name
参数为 null
。
未找到可用的资源集,并且没有默认区域性的资源。 有关如何处理此异常的信息,请参阅 ResourceManager 类主题“处理 MissingManifestResourceException 和 MissingSatelliteAssemblyException 异常”一节。
默认区域性的资源位于无法找到的附属程序集。 有关如何处理此异常的信息,请参阅 ResourceManager 类主题“处理 MissingManifestResourceException 和 MissingSatelliteAssemblyException 异常”一节。
示例
下面的示例使用 GetObject(String, CultureInfo) 方法反序列化一个自定义对象。 如果使用定义以下 Numbers
名为 的 Visual Basic) ,则此示例包含名为 NumberInfo.cs (NumberInfo.vb 的源代码文件。 此结构旨在由一个简单的教育应用使用,该应用教授非英语学生使用英语计数到 10。 请注意, Numbers
类用 SerializableAttribute 特性标记。
using System;
[Serializable] public class Numbers
{
public readonly string One;
public readonly string Two;
public readonly string Three;
public readonly string Four;
public readonly string Five;
public readonly string Six;
public readonly string Seven;
public readonly string Eight;
public readonly string Nine;
public readonly string Ten;
public Numbers(string one, string two, string three, string four,
string five, string six, string seven, string eight,
string nine, string ten)
{
this.One = one;
this.Two = two;
this.Three = three;
this.Four = four;
this.Five = five;
this.Six = six;
this.Seven = seven;
this.Eight = eight;
this.Nine = nine;
this.Ten = ten;
}
}
<Serializable> Public Class Numbers
Public Readonly One As String
Public ReadOnly Two As String
Public ReadOnly Three As String
Public ReadOnly Four As String
Public ReadOnly Five As String
Public ReadOnly Six As String
Public ReadOnly Seven As String
Public ReadOnly Eight As String
Public ReadOnly Nine As String
Public ReadOnly Ten As String
Public Sub New(one As String, two As String, three As String, four As String,
five As String, six As String, seven As String, eight As String,
nine As String, ten As String)
Me.One = one
Me.Two = two
Me.Three = three
Me.Four = four
Me.Five = five
Me.Six = six
Me.Seven = seven
Me.Eight = eight
Me.Nine = nine
Me.Ten = ten
End Sub
End Class
以下源代码来自名为 CreateResources.cs 的文件 (CreateResources.vb for Visual Basic) 为默认英语以及法语、葡萄牙语和俄语创建 XML 资源文件。
using System;
using System.Resources;
public class CreateResource
{
public static void Main()
{
Numbers en = new Numbers("one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten");
CreateResourceFile(en, "en");
Numbers fr = new Numbers("un", "deux", "trois", "quatre", "cinq",
"six", "sept", "huit", "neuf", "dix");
CreateResourceFile(fr, "fr");
Numbers pt = new Numbers("um", "dois", "três", "quatro", "cinco",
"seis", "sete", "oito", "nove", "dez");
CreateResourceFile(pt, "pt");
Numbers ru = new Numbers("один", "два", "три", "четыре", "пять",
"шесть", "семь", "восемь", "девять", "десять");
CreateResourceFile(ru, "ru");
}
public static void CreateResourceFile(Numbers n, string lang)
{
string filename = @".\NumberResources" +
(lang != "en" ? "." + lang : "" ) +
".resx";
ResXResourceWriter rr = new ResXResourceWriter(filename);
rr.AddResource("Numbers", n);
rr.Generate();
rr.Close();
}
}
Imports System.Resources
Module CreateResource
Public Sub Main()
Dim en As New Numbers("one", "two", "three", "four", "five",
"six", "seven", "eight", "nine", "ten")
CreateResourceFile(en, "en")
Dim fr As New Numbers("un", "deux", "trois", "quatre", "cinq",
"six", "sept", "huit", "neuf", "dix")
CreateResourceFile(fr, "fr")
Dim pt As New Numbers("um", "dois", "três", "quatro", "cinco",
"seis", "sete", "oito", "nove", "dez")
CreateResourceFile(pt, "pt")
Dim ru As New Numbers("один", "два", "три", "четыре", "пять",
"шесть", "семь", "восемь", "девять", "десять")
CreateResourceFile(ru, "ru")
End Sub
Public Sub CreateResourceFile(n As Numbers, lang As String)
Dim filename As String = ".\NumberResources" +
If(lang <> "en", "." + lang, "") +
".resx"
Dim rr As New ResXResourceWriter(filename)
rr.AddResource("Numbers", n)
rr.Generate()
rr.Close()
End Sub
End Module
资源由以下应用使用,该应用将当前 UI 区域性设置为法语 (法国) 、葡萄牙语 (巴西) 或俄语 (俄罗斯) 。 它调用 GetObject(String) 方法以获取 Numbers
包含本地化数字的对象,调用 GetObject(String, CultureInfo) 方法获取 Numbers
包含英语语言数字的对象。 然后,它使用当前 UI 区域性和英语显示奇数。 源代码文件名为 ShowNumbers.cs (ShowNumbers.vb) 。
using System;
using System.Globalization;
using System.Resources;
using System.Threading;
[assembly:NeutralResourcesLanguageAttribute("en-US")]
public class Example
{
static string[] cultureNames = { "fr-FR", "pt-BR", "ru-RU" };
public static void Main()
{
// Make any non-default culture the current culture.
Random rnd = new Random();
CultureInfo culture = CultureInfo.CreateSpecificCulture(cultureNames[rnd.Next(0, cultureNames.Length)]);
Thread.CurrentThread.CurrentUICulture = culture;
Console.WriteLine("The current culture is {0}\n", CultureInfo.CurrentUICulture.Name);
CultureInfo enCulture = CultureInfo.CreateSpecificCulture("en-US");
ResourceManager rm = new ResourceManager(typeof(NumberResources));
Numbers numbers = (Numbers) rm.GetObject("Numbers");
Numbers numbersEn = (Numbers) rm.GetObject("Numbers", enCulture);
Console.WriteLine("{0} --> {1}", numbers.One, numbersEn.One);
Console.WriteLine("{0} --> {1}", numbers.Three, numbersEn.Three);
Console.WriteLine("{0} --> {1}", numbers.Five, numbersEn.Five);
Console.WriteLine("{0} --> {1}", numbers.Seven, numbersEn.Seven);
Console.WriteLine("{0} --> {1}\n", numbers.Nine, numbersEn.Nine);
}
}
internal class NumberResources
{
}
// The example displays output like the following:
// The current culture is pt-BR
//
// um --> one
// três --> three
// cinco --> five
// sete --> seven
// nove --> nine
Imports System.Globalization
Imports System.Resources
Imports System.Threading
<assembly:NeutralResourcesLanguageAttribute("en-US")>
Module Example
Dim cultureNames() As String = { "fr-FR", "pt-BR", "ru-RU" }
Public Sub Main()
' Make any non-default culture the current culture.
Dim rnd As New Random
Dim culture As CultureInfo = CultureInfo.CreateSpecificCulture(cultureNames(rnd.Next(0, cultureNames.Length)))
Thread.CurrentThread.CurrentUICulture = culture
Console.WriteLine("The current culture is {0}", CultureInfo.CurrentUICulture.Name)
Console.WriteLine()
Dim enCulture As CultureInfo = CultureInfo.CreateSpecificCulture("en-US")
Dim rm As New ResourceManager(GetType(NumberResources))
Dim numbers As Numbers = CType(rm.GetObject("Numbers"), Numbers)
Dim numbersEn As Numbers = CType(rm.GetObject("Numbers", enCulture), Numbers)
Console.WriteLine("{0} --> {1}", numbers.One, numbersEn.One)
Console.WriteLine("{0} --> {1}", numbers.Three, numbersEn.Three)
Console.WriteLine("{0} --> {1}", numbers.Five, numbersEn.Five)
Console.WriteLine("{0} --> {1}", numbers.Seven, numbersEn.Seven)
Console.WriteLine("{0} --> {1}", numbers.Nine, numbersEn.Nine)
Console.WriteLine()
End Sub
End Module
Friend Class NumberResources
End Class
' The example displays output like the following:
' The current culture is pt-BR
'
' um --> one
' três --> three
' cinco --> five
' sete --> seven
' nove --> nine
可以使用以下批处理文件生成并执行示例的 Visual Basic 版本。 如果使用的是 C#,请将 替换为 vbc
csc
,并将 扩展替换为 .vb
.cs
。
vbc /t:library NumberInfo.vb
vbc CreateResources.vb /r:NumberInfo.dll
CreateResources
resgen NumberResources.resx /r:NumberInfo.dll
resgen NumberResources.fr.resx /r:Numberinfo.dll
Md fr
al /embed:NumberResources.fr.resources /culture:fr /t:lib /out:fr\ShowNumbers.resources.dll
resgen NumberResources.pt.resx /r:Numberinfo.dll
Md pt
al /embed:NumberResources.pt.resources /culture:pt /t:lib /out:pt\ShowNumbers.resources.dll
resgen NumberResources.ru.resx /r:Numberinfo.dll
Md ru
al /embed:NumberResources.ru.resources /culture:ru /t:lib /out:ru\ShowNumbers.resources.dll
vbc ShowNumbers.vb /r:NumberInfo.dll /resource:NumberResources.resources
ShowNumbers.exe
注解
方法 GetObject(String, CultureInfo) 用于检索非字符串资源。 其中包括属于基元数据类型(如 Int32 或 Double)的值,位图 (例如 System.Drawing.Bitmap 对象) 或自定义序列化对象。 通常,返回的对象必须在 C#) 中 (强制转换,或者在 Visual Basic) 中将 (转换为相应类型的对象。
对于 指定的 culture
区域性或属性指定的 CultureInfo.CurrentUICulture 区域性(如果 culture
null
为 ),则对返回的资源进行本地化。 如果资源未针对该区域性进行本地化,则资源管理器使用回退规则来加载相应的资源。 如果未找到一组可用本地化资源,则资源管理器会回退默认区域性的资源。 如果未找到默认区域性的资源集,该方法将 MissingManifestResourceException 引发异常,或者如果资源集预期驻留在附属程序集中,则引发 MissingSatelliteAssemblyException 异常。 如果资源管理器可以加载适当的资源集,但找不到名为 name
的资源,该方法将 null
返回 。
属性 IgnoreCase 确定 与资源名称的比较 name
是否不区分大小写 (默认) 或区分大小写。
注意
此方法引发的异常数可能多于所列的异常数。 发生这种情况的一个原因是此方法调用的方法引发异常。 例如, FileLoadException 如果部署或安装附属程序集时出错,可能会引发异常; SerializationException 如果反序列化类型时用户定义的类型引发用户定义的异常,则可能会引发异常。
性能注意事项
如果使用同name
一参数多次调用 GetObject 方法,请不要依赖于每次调用时返回对同一对象的引用的方法。 这是因为 方法 GetObject 可以返回对缓存中现有资源对象的引用,也可以重新加载资源并返回对新资源对象的引用。
线程安全性
方法 GetObject(String, CultureInfo) 是线程安全的。