Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Tento článek obsahuje doplňující poznámky k referenční dokumentaci pro toto rozhraní API.
Metoda GetObject se používá k načtení neřetězcových prostředků. Patří mezi ně hodnoty, které patří k primitivním datovým typům, jako jsou Int32 nebo Double, bitmapy (například System.Drawing.Bitmap objekt), nebo serializované vlastní objekty. Vrácený objekt musí být obvykle přetypován (v jazyce C#) nebo převeden (v jazyce Visual Basic) na objekt příslušného typu.
Vlastnost IgnoreCase určuje, zda porovnání name s názvy prostředků je nerozlišující velká a malá písmena, nebo rozlišující velká a malá písmena (výchozí).
Poznámka:
Tyto metody mohou vyvolat více výjimek, než jsou uvedeny. Jedním z důvodů, proč k tomu může dojít, je v případě, že metoda, kterou tato metoda volá, vyvolá výjimku. Výjimka FileLoadException může být vyvolána například v případě, že došlo k chybě při nasazování nebo instalaci satelitního sestavení, nebo může být vyvolána výjimka SerializationException, pokud uživatelem definovaný typ vyvolá výjimku definovanou uživatelem při deserializaci typu.
metoda GetObject(String)
Prostředek, který je vrácen, je lokalizován pro kulturní jazykovou verzi uživatelského rozhraní aktuálního vlákna, která je definována vlastností CultureInfo.CurrentUICulture. Pokud daný prostředek není lokalizovaný pro konkrétní kulturu, správce prostředků použije náhradní pravidla k načtení odpovídajícího prostředku. Pokud se nenajde žádná použitelná sada lokalizovaných prostředků, vrátí se ResourceManager zpět k prostředkům výchozí jazykové verze. Pokud není nalezena sada prostředků pro výchozí jazykovou verzi, metoda vyvolá výjimku MissingManifestResourceException, nebo pokud se předpokládá, že se sada prostředků nachází v satelitním sestavení, vyvolá výjimku MissingSatelliteAssemblyException. Pokud správce prostředků může načíst příslušnou sadu prostředků, ale nemůže najít prostředek s názvem name, vrátí metoda null.
Příklad
Následující příklad používá metodu GetObject(String) k deserializaci vlastního objektu. Příklad obsahuje soubor zdrojového kódu s názvem UIElements.cs (UIElements.vb pokud používáte Visual Basic), který definuje následující strukturu s názvem PersonTable. Tato struktura je určena pro obecné rutiny zobrazení tabulky, která zobrazuje lokalizované názvy sloupců tabulky. Všimněte si, že PersonTable struktura je označena atributem 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
Následující kód ze souboru s názvem CreateResources.cs (nebo CreateResources.vb pro Visual Basic) vytvoří soubor prostředků XML s názvem UIResources.resx, který obsahuje název tabulky a PersonTable objekt obsahující informace pro aplikaci lokalizovanou pro anglický jazyk.
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
Následující kód v souboru zdrojového kódu s názvem GetObject.cs (nebo GetObject.vb) pak načte prostředky a zobrazí je v konzole.
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
Můžete sestavit potřebný soubor prostředků a sestavení a poté spustit aplikaci spuštěním následujícího dávkového souboru. Je nutné použít /r možnost zadat Resgen.exe s odkazem na UIElements.dll, aby měl přístup k informacím o PersonTable struktuře. Pokud používáte jazyk C#, nahraďte název kompilátoru vbc názvem csc a příponu .vb příponou .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
metoda GetObject(String, CultureInfo)
Vrácený prostředek je lokalizován pro jazykovou verzi, která je určena culture, nebo pro jazykovou verzi, kterou určuje vlastnost CultureInfo.CurrentUICulture, pokud culture je null. Pokud daný prostředek není lokalizovaný pro konkrétní kulturu, správce prostředků použije náhradní pravidla k načtení odpovídajícího prostředku. Pokud se nenajde žádná použitelná sada lokalizovaných prostředků, správce prostředků se vrátí k prostředkům výchozí jazykové verze. Pokud není nalezena sada prostředků pro výchozí jazykovou verzi, metoda vyvolá výjimku MissingManifestResourceException, nebo pokud se předpokládá, že se sada prostředků nachází v satelitním sestavení, vyvolá výjimku MissingSatelliteAssemblyException. Pokud správce prostředků může načíst příslušnou sadu prostředků, ale nemůže najít prostředek s názvem name, vrátí metoda null.
Příklad
Následující příklad používá metodu GetObject(String, CultureInfo) k deserializaci vlastního objektu. Příklad obsahuje soubor zdrojového kódu s názvem NumberInfo.cs (NumberInfo.vb pokud používáte Visual Basic), který definuje následující strukturu s názvem Numbers. Tato struktura je určená pro jednoduchou vzdělávací aplikaci, která učí studenty, kteří nemluví anglicky, aby počítali do deseti v angličtině. Všimněte si, že Numbers třída je označena atributem 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
Následující zdrojový kód ze souboru s názvem CreateResources.cs (CreateResources.vb pro Visual Basic) vytvoří soubory prostředků XML pro výchozí anglický jazyk a také pro francouzštinu, portugalštinu a ruštinu.
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
Prostředky využívají následující aplikace, která nastaví aktuální jazykovou verzi uživatelského rozhraní na francouzštinu (Francie), portugalštinu (Brazílie) nebo ruštinu (Rusko). Volá metodu GetObject(String) pro získání objektu Numbers obsahujícího lokalizovaná čísla a metodu GetObject(String, CultureInfo) pro získání objektu Numbers , který obsahuje anglická jazyková čísla. Potom zobrazí lichá čísla pomocí aktuální jazykové verze uživatelského rozhraní a anglického jazyka. Soubor zdrojového kódu má název 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
Následující dávkový soubor můžete použít k sestavení a spuštění verze jazyka Visual Basic v příkladu. Pokud používáte jazyk C#, nahraďte vbc za csc a nahraďte rozšíření .vb rozšířením .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
Důležité informace o výkonu
Pokud metodu GetObject voláte vícekrát se stejným name parametrem, nezávisí na metodě vracející odkaz na stejný objekt s každým voláním. Důvodem je to, že GetObject metoda může vrátit odkaz na existující objekt prostředku v mezipaměti, nebo může prostředek znovu načíst a vrátit odkaz na nový objekt prostředku.