ResourceManager.GetObject Metod
Definition
Viktigt
En del information gäller för förhandsversionen av en produkt och kan komma att ändras avsevärt innan produkten blir allmänt tillgänglig. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, avseende informationen som visas här.
Returnerar värdet för den angivna icke-strängresursen för den aktuella kulturen.
Överlagringar
| Name | Description |
|---|---|
| GetObject(String) |
Returnerar värdet för den angivna resursen som inte är sträng. |
| GetObject(String, CultureInfo) |
Hämtar värdet för den angivna icke-strängresursen lokaliserad för den angivna kulturen. |
GetObject(String)
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
Returnerar värdet för den angivna resursen som inte är sträng.
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
Parametrar
- name
- String
Namnet på resursen som ska hämtas.
Returer
Värdet för den resurs som lokaliserats för anroparens aktuella kulturinställningar. Om det finns en lämplig resursuppsättning men name inte kan hittas returnerar nullmetoden .
Undantag
Parametern name är null.
Ingen användbar uppsättning lokaliserade resurser har hittats och det finns inga standardkulturresurser. Information om hur du hanterar det här undantaget finns i avsnittet "Hantera MissingManifestResourceException och MissingSatelliteAssemblyException Exceptions" i klassavsnittet ResourceManager .
Standardkulturens resurser finns i en satellitsammansättning som inte kunde hittas. Information om hur du hanterar det här undantaget finns i avsnittet "Hantera MissingManifestResourceException och MissingSatelliteAssemblyException Exceptions" i klassavsnittet ResourceManager .
Kommentarer
Metoden GetObject används för att hämta icke-strängresurser. Dessa inkluderar värden som tillhör primitiva datatyper som Int32 eller Double, bitmappar (till exempel ett System.Drawing.Bitmap objekt) eller anpassade serialiserade objekt. Normalt måste det returnerade objektet gjutas (i C#) eller konverteras (i Visual Basic) till ett objekt av lämplig typ.
Egenskapen IgnoreCase avgör om jämförelsen av name med namnen på resurserna är skiftlägesokänslig eller skiftlägeskänslig (standardvärdet).
Note
Dessa metoder kan generera fler undantag än vad som visas. En orsak till att detta kan inträffa är om en metod som den här metoden anropar utlöser ett undantag. Ett FileLoadException undantag kan till exempel utlösas om ett fel uppstod vid distribution eller installation av en satellitsammansättning, eller om ett SerializationException undantag kan utlösas om en användardefinierad typ utlöser ett användardefinierat undantag när typen deserialiseras.
GetObject(String) metod
Den returnerade resursen är lokaliserad för användargränssnittskulturen i den aktuella tråden, som definieras av egenskapen CultureInfo.CurrentUICulture. Om resursen inte är lokaliserad för den kulturen använder resurshanteraren reservregler för att läsa in en lämplig resurs. Om ingen användbar uppsättning lokaliserade resurser hittas faller ResourceManager tillbaka på standardkulturens resurser. Om en resursuppsättning för standardkulturen inte hittas utlöser metoden ett MissingManifestResourceException undantag eller, om resursuppsättningen förväntas finnas i en satellitsammansättning, ett MissingSatelliteAssemblyException undantag. Om resurshanteraren kan läsa in en lämplig resursuppsättning men inte kan hitta en resurs med namnet namereturnerar metoden null.
Example
I följande exempel används metoden GetObject(String) för att deserialisera ett anpassat objekt. Exemplet innehåller en källkodsfil med namnet UIElements.cs (UIElements.vb om du använder Visual Basic) som definierar följande struktur med namnet PersonTable. Den här strukturen är avsedd att användas av en allmän tabellvisningsrutin som visar de lokaliserade namnen på tabellkolumner. Observera att PersonTable-strukturen är markerad med attributet 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
Följande kod från en fil med namnet CreateResources.cs (eller CreateResources.vb för Visual Basic) skapar en XML-resursfil med namnet UIResources.resx som lagrar en tabellrubrik och ett PersonTable objekt som innehåller information för en app som är lokaliserad för det engelska språket.
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
Följande kod i en källkodsfil med namnet GetObject.cs (eller GetObject.vb) hämtar sedan resurserna och visar dem i konsolen.
using System;
using System.Resources;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example2
{
public static void Main()
{
string fmtString = String.Empty;
ResourceManager rm = new ResourceManager("UIResources", typeof(Example2).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
Du kan skapa den nödvändiga resursfilen och sammansättningarna och köra appen genom att köra följande batchfil. Du måste använda alternativet /r för att ange Resgen.exe med en referens till UIElements.dll så att den kan komma åt information om PersonTable struktur. Om du använder C# ersätter du vbc-kompilatorns namn med cscoch ersätter .vb-tillägget med .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) metod
Den returnerade resursen lokaliseras för den kultur som anges av culture, eller för den kultur som anges av egenskapen CultureInfo.CurrentUICulture om culture är null. Om resursen inte är lokaliserad för den kulturen använder resurshanteraren reservregler för att läsa in en lämplig resurs. Om ingen användbar uppsättning lokaliserade resurser hittas återgår resurshanteraren till standardkulturens resurser. Om en resursuppsättning för standardkulturen inte hittas utlöser metoden ett MissingManifestResourceException undantag eller, om resursuppsättningen förväntas finnas i en satellitsammansättning, ett MissingSatelliteAssemblyException undantag. Om resurshanteraren kan läsa in en lämplig resursuppsättning men inte kan hitta en resurs med namnet namereturnerar metoden null.
Example
I följande exempel används metoden GetObject(String, CultureInfo) för att deserialisera ett anpassat objekt. Exemplet innehåller en källkodsfil med namnet NumberInfo.cs (NumberInfo.vb om du använder Visual Basic) som definierar följande struktur med namnet Numbers. Denna struktur är avsedd att användas av en enkel utbildningsapp som lär icke-engelsktalande studenter att räkna till tio på engelska. Observera att klassen Numbers har markerats med attributet 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
Följande källkod från en fil med namnet CreateResources.cs (CreateResources.vb för Visual Basic) skapar XML-resursfiler för standardspråket engelska, samt för franska, portugisiska och ryska språk.
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
Resurserna förbrukas av följande app, som anger den aktuella användargränssnittskulturen till franska (Frankrike), portugisiska (Brasilien) eller ryska (Ryssland). Den anropar metoden GetObject(String) för att hämta ett Numbers objekt som innehåller lokaliserade tal och metoden GetObject(String, CultureInfo) för att hämta ett Numbers objekt som innehåller engelskspråkiga tal. Sedan visas udda tal med den aktuella användargränssnittskulturen och det engelska språket. Källkodsfilen heter 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 {CultureInfo.CurrentUICulture.Name}\n");
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($"{numbers.One} --> {numbersEn.One}");
Console.WriteLine($"{numbers.Three} --> {numbersEn.Three}");
Console.WriteLine($"{numbers.Five} --> {numbersEn.Five}");
Console.WriteLine($"{numbers.Seven} --> {numbersEn.Seven}");
Console.WriteLine($"{numbers.Nine} --> {numbersEn.Nine}\n");
}
}
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
Du kan använda följande batchfil för att skapa och köra Visual Basic-versionen av exemplet. Om du använder C# ersätter du vbc med cscoch ersätter .vb-tillägget med .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
Prestandaöverväganden
Om du anropar metoden GetObject flera gånger med samma name parameter, är du inte beroende av att metoden returnerar en referens till samma objekt med varje anrop. Det beror på att metoden GetObject kan returnera en referens till ett befintligt resursobjekt i en cache, eller så kan den läsa in resursen igen och returnera en referens till ett nytt resursobjekt.
Se även
Gäller för
GetObject(String, CultureInfo)
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
- Källa:
- ResourceManager.cs
Hämtar värdet för den angivna icke-strängresursen lokaliserad för den angivna kulturen.
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
Parametrar
- name
- String
Namnet på resursen som ska hämtas.
- culture
- CultureInfo
Den kultur som resursen är lokaliserad för. Om resursen inte är lokaliserad för den här kulturen använder resurshanteraren reservregler för att hitta en lämplig resurs.
Om det här värdet är nullCultureInfo hämtas objektet med hjälp CurrentUICulture av egenskapen .
Returer
Värdet för resursen, lokaliserat för den angivna kulturen. Om det finns en lämplig resursuppsättning men name inte kan hittas returnerar nullmetoden .
Undantag
Parametern name är null.
Ingen användbar uppsättning resurser har hittats och det finns inga standardkulturresurser. Information om hur du hanterar det här undantaget finns i avsnittet "Hantera MissingManifestResourceException och MissingSatelliteAssemblyException Exceptions" i klassavsnittet ResourceManager .
Standardkulturens resurser finns i en satellitsammansättning som inte kunde hittas. Information om hur du hanterar det här undantaget finns i avsnittet "Hantera MissingManifestResourceException och MissingSatelliteAssemblyException Exceptions" i klassavsnittet ResourceManager .
Kommentarer
Metoden GetObject används för att hämta icke-strängresurser. Dessa inkluderar värden som tillhör primitiva datatyper som Int32 eller Double, bitmappar (till exempel ett System.Drawing.Bitmap objekt) eller anpassade serialiserade objekt. Normalt måste det returnerade objektet gjutas (i C#) eller konverteras (i Visual Basic) till ett objekt av lämplig typ.
Egenskapen IgnoreCase avgör om jämförelsen av name med namnen på resurserna är skiftlägesokänslig eller skiftlägeskänslig (standardvärdet).
Note
Dessa metoder kan generera fler undantag än vad som visas. En orsak till att detta kan inträffa är om en metod som den här metoden anropar utlöser ett undantag. Ett FileLoadException undantag kan till exempel utlösas om ett fel uppstod vid distribution eller installation av en satellitsammansättning, eller om ett SerializationException undantag kan utlösas om en användardefinierad typ utlöser ett användardefinierat undantag när typen deserialiseras.
GetObject(String) metod
Den returnerade resursen är lokaliserad för användargränssnittskulturen i den aktuella tråden, som definieras av egenskapen CultureInfo.CurrentUICulture. Om resursen inte är lokaliserad för den kulturen använder resurshanteraren reservregler för att läsa in en lämplig resurs. Om ingen användbar uppsättning lokaliserade resurser hittas faller ResourceManager tillbaka på standardkulturens resurser. Om en resursuppsättning för standardkulturen inte hittas utlöser metoden ett MissingManifestResourceException undantag eller, om resursuppsättningen förväntas finnas i en satellitsammansättning, ett MissingSatelliteAssemblyException undantag. Om resurshanteraren kan läsa in en lämplig resursuppsättning men inte kan hitta en resurs med namnet namereturnerar metoden null.
Example
I följande exempel används metoden GetObject(String) för att deserialisera ett anpassat objekt. Exemplet innehåller en källkodsfil med namnet UIElements.cs (UIElements.vb om du använder Visual Basic) som definierar följande struktur med namnet PersonTable. Den här strukturen är avsedd att användas av en allmän tabellvisningsrutin som visar de lokaliserade namnen på tabellkolumner. Observera att PersonTable-strukturen är markerad med attributet 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
Följande kod från en fil med namnet CreateResources.cs (eller CreateResources.vb för Visual Basic) skapar en XML-resursfil med namnet UIResources.resx som lagrar en tabellrubrik och ett PersonTable objekt som innehåller information för en app som är lokaliserad för det engelska språket.
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
Följande kod i en källkodsfil med namnet GetObject.cs (eller GetObject.vb) hämtar sedan resurserna och visar dem i konsolen.
using System;
using System.Resources;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example2
{
public static void Main()
{
string fmtString = String.Empty;
ResourceManager rm = new ResourceManager("UIResources", typeof(Example2).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
Du kan skapa den nödvändiga resursfilen och sammansättningarna och köra appen genom att köra följande batchfil. Du måste använda alternativet /r för att ange Resgen.exe med en referens till UIElements.dll så att den kan komma åt information om PersonTable struktur. Om du använder C# ersätter du vbc-kompilatorns namn med cscoch ersätter .vb-tillägget med .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) metod
Den returnerade resursen lokaliseras för den kultur som anges av culture, eller för den kultur som anges av egenskapen CultureInfo.CurrentUICulture om culture är null. Om resursen inte är lokaliserad för den kulturen använder resurshanteraren reservregler för att läsa in en lämplig resurs. Om ingen användbar uppsättning lokaliserade resurser hittas återgår resurshanteraren till standardkulturens resurser. Om en resursuppsättning för standardkulturen inte hittas utlöser metoden ett MissingManifestResourceException undantag eller, om resursuppsättningen förväntas finnas i en satellitsammansättning, ett MissingSatelliteAssemblyException undantag. Om resurshanteraren kan läsa in en lämplig resursuppsättning men inte kan hitta en resurs med namnet namereturnerar metoden null.
Example
I följande exempel används metoden GetObject(String, CultureInfo) för att deserialisera ett anpassat objekt. Exemplet innehåller en källkodsfil med namnet NumberInfo.cs (NumberInfo.vb om du använder Visual Basic) som definierar följande struktur med namnet Numbers. Denna struktur är avsedd att användas av en enkel utbildningsapp som lär icke-engelsktalande studenter att räkna till tio på engelska. Observera att klassen Numbers har markerats med attributet 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
Följande källkod från en fil med namnet CreateResources.cs (CreateResources.vb för Visual Basic) skapar XML-resursfiler för standardspråket engelska, samt för franska, portugisiska och ryska språk.
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
Resurserna förbrukas av följande app, som anger den aktuella användargränssnittskulturen till franska (Frankrike), portugisiska (Brasilien) eller ryska (Ryssland). Den anropar metoden GetObject(String) för att hämta ett Numbers objekt som innehåller lokaliserade tal och metoden GetObject(String, CultureInfo) för att hämta ett Numbers objekt som innehåller engelskspråkiga tal. Sedan visas udda tal med den aktuella användargränssnittskulturen och det engelska språket. Källkodsfilen heter 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 {CultureInfo.CurrentUICulture.Name}\n");
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($"{numbers.One} --> {numbersEn.One}");
Console.WriteLine($"{numbers.Three} --> {numbersEn.Three}");
Console.WriteLine($"{numbers.Five} --> {numbersEn.Five}");
Console.WriteLine($"{numbers.Seven} --> {numbersEn.Seven}");
Console.WriteLine($"{numbers.Nine} --> {numbersEn.Nine}\n");
}
}
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
Du kan använda följande batchfil för att skapa och köra Visual Basic-versionen av exemplet. Om du använder C# ersätter du vbc med cscoch ersätter .vb-tillägget med .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
Prestandaöverväganden
Om du anropar metoden GetObject flera gånger med samma name parameter, är du inte beroende av att metoden returnerar en referens till samma objekt med varje anrop. Det beror på att metoden GetObject kan returnera en referens till ett befintligt resursobjekt i en cache, eller så kan den läsa in resursen igen och returnera en referens till ett nytt resursobjekt.
Trådsäkerhet
Metoden GetObject(String, CultureInfo) är trådsäker.