Metody System.Resources.ResourceManager.GetObject
Ten artykuł zawiera dodatkowe uwagi dotyczące dokumentacji referencyjnej dla tego interfejsu API.
Metoda służy do pobierania GetObject zasobów innych niż ciąg. Obejmują one wartości należące do typów danych pierwotnych, takich jak lub Double, mapy bitowe (takie jak Int32System.Drawing.Bitmap obiekt) lub niestandardowe obiekty serializowane. Zazwyczaj zwracany obiekt musi być rzutowany (w języku C#) lub przekonwertowany (w Visual Basic) na obiekt odpowiedniego typu.
Właściwość IgnoreCase określa, czy porównanie name
nazw zasobów jest bez uwzględniania wielkości liter lub wielkość liter (wartość domyślna).
Uwaga
Metody te mogą zgłaszać więcej wyjątków niż są wymienione. Jedną z przyczyn może się to zdarzyć, jeśli metoda wywoływana przez tę metodę zgłasza wyjątek. Na przykład wyjątek może zostać zgłoszony, FileLoadException jeśli podczas wdrażania lub instalowania zestawu satelitarnego wystąpił błąd lub SerializationException wyjątek, jeśli typ zdefiniowany przez użytkownika zgłasza wyjątek zdefiniowany przez użytkownika, gdy typ jest deserializowany.
GetObject(String) Metoda
Zwrócony zasób jest zlokalizowany dla kultury interfejsu użytkownika bieżącego wątku CultureInfo.CurrentUICulture , który jest zdefiniowany przez właściwość . Jeśli zasób nie jest zlokalizowany dla tej kultury, menedżer zasobów używa reguł rezerwowych do ładowania odpowiedniego zasobu. Jeśli nie zostanie znaleziony zestaw zlokalizowanych zasobów, ResourceManager zasoby domyślnej kultury będą wracać do zasobów kultury domyślnej. Jeśli nie można odnaleźć zestawu zasobów dla kultury domyślnej, metoda zgłasza MissingManifestResourceException wyjątek lub, jeśli zestaw zasobów ma znajdować się w zestawie satelitarnym, wyjątek MissingSatelliteAssemblyException . Jeśli menedżer zasobów może załadować odpowiedni zestaw zasobów, ale nie może znaleźć zasobu o nazwie name
, metoda zwraca wartość null
.
Przykład
W poniższym przykładzie użyto GetObject(String) metody do deserializacji obiektu niestandardowego. Przykład zawiera plik kodu źródłowego o nazwie UIElements.cs (UIElements.vb jeśli używasz języka Visual Basic), który definiuje następującą strukturę o nazwie PersonTable
. Ta struktura ma być używana przez ogólną procedurę wyświetlania tabeli, która wyświetla zlokalizowane nazwy kolumn tabeli. Należy pamiętać, że PersonTable
struktura jest oznaczona atrybutem 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 PersonTable1
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
Poniższy kod z pliku o nazwie CreateResources.cs (lub CreateResources.vb dla języka Visual Basic) tworzy plik zasobów XML o nazwie UIResources.resx, który przechowuje tytuł tabeli i PersonTable
obiekt zawierający informacje o aplikacji zlokalizowanej dla języka angielskiego.
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 CreateResource1
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
Poniższy kod w pliku kodu źródłowego o nazwie GetObject.cs (lub GetObject.vb) następnie pobiera zasoby i wyświetla je w konsoli.
using System;
using System.Resources;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example3
{
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
Możesz utworzyć niezbędny plik zasobów i zestawy oraz uruchomić aplikację, wykonując następujący plik wsadowy. Należy użyć /r
opcji , aby podać Resgen.exe z odwołaniem do UIElements.dll, aby mógł uzyskać dostęp do informacji o PersonTable
strukturze. Jeśli używasz języka C#, zastąp nazwę kompilatora vbc
.vb
ciągiem csc
, a następnie zastąp rozszerzenie ciągiem .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(String, CultureInfo) Metoda
Zwrócony zasób jest zlokalizowany dla kultury określonej przez culture
, lub dla kultury określonej przez CultureInfo.CurrentUICulture właściwość , jeśli culture
ma wartość null
. Jeśli zasób nie jest zlokalizowany dla tej kultury, menedżer zasobów używa reguł rezerwowych do ładowania odpowiedniego zasobu. Jeśli nie można odnaleźć zestawu zlokalizowanych zasobów, menedżer zasobów wróci do zasobów kultury domyślnej. Jeśli nie można odnaleźć zestawu zasobów dla kultury domyślnej, metoda zgłasza MissingManifestResourceException wyjątek lub, jeśli zestaw zasobów ma znajdować się w zestawie satelitarnym, wyjątek MissingSatelliteAssemblyException . Jeśli menedżer zasobów może załadować odpowiedni zestaw zasobów, ale nie może znaleźć zasobu o nazwie name
, metoda zwraca wartość null
.
Przykład
W poniższym przykładzie użyto GetObject(String, CultureInfo) metody do deserializacji obiektu niestandardowego. Przykład zawiera plik kodu źródłowego o nazwie NumberInfo.cs (NumberInfo.vb jeśli używasz języka Visual Basic), który definiuje następującą strukturę o nazwie Numbers
. Ta struktura ma być używana przez prostą aplikację edukacyjną, która uczy studentów spoza języka angielskiego, aby liczyli się do dziesięciu w języku angielskim. Należy pamiętać, że Numbers
klasa jest oznaczona atrybutem SerializableAttribute .
using System;
[Serializable] public class Numbers2
{
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 Numbers2(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 Numbers2
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
Poniższy kod źródłowy z pliku o nazwie CreateResources.cs (CreateResources.vb for Visual Basic) tworzy pliki zasobów XML dla domyślnego języka angielskiego, a także dla języków francuskich, portugalskich i rosyjskich.
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
Zasoby są używane przez następującą aplikację, która ustawia bieżącą kulturę interfejsu użytkownika na francuski (Francja), Portugalski (Brazylia) lub Rosyjski (Rosja). Wywołuje metodę GetObject(String)Numbers
, aby uzyskać obiekt zawierający zlokalizowane liczby i GetObject(String, CultureInfo) metodę Numbers
w celu pobrania obiektu zawierającego numery języków angielskich. Następnie wyświetla nieparzyste liczby przy użyciu bieżącej kultury interfejsu użytkownika i języka angielskiego. Plik kodu źródłowego nosi nazwę 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
Module Example2
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
Aby skompilować i wykonać wersję przykładu języka Visual Basic, możesz użyć następującego pliku wsadowego. Jeśli używasz języka C#, zastąp ciąg ciąg , a następnie zastąp vbc
csc
.vb
rozszerzenie ciągiem .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
Zagadnienia dotyczące wydajności
Jeśli metoda jest wywoływana GetObject wiele razy z tym samym name
parametrem, nie należy polegać na metodzie zwracającej odwołanie do tego samego obiektu z każdym wywołaniem. Jest to spowodowane tym, że GetObject metoda może zwrócić odwołanie do istniejącego obiektu zasobu w pamięci podręcznej lub może ponownie załadować zasób i zwrócić odwołanie do nowego obiektu zasobu.