System.Resources.ResourceManager.GetObject metódusai

Megjegyzés

Ez a cikk kiegészítő megjegyzéseket tartalmaz az API referenciadokumentációjához.

A GetObject metódus nem sztring típusú erőforrások lekérésére szolgál. Ezek közé tartoznak a primitív adattípusokhoz tartozó értékek, például Int32 vagy Double, bitképek (például System.Drawing.Bitmap objektum) vagy egyéni szerializált objektumok. A visszaadott objektumot általában (C#-ban) kell leadni, vagy (a Visual Basicben) a megfelelő típusú objektummá kell konvertálni.

A IgnoreCase tulajdonság határozza meg, hogy a name és az erőforrások neveinek összehasonlítása megkülönbözteti-e a kis- és nagybetűket (alapértelmezett).

Megjegyzés

Ezek a metódusok több kivételt vethetnek ki, mint a felsoroltak. Ennek egyik oka az lehet, ha egy metódus, amelyet ez a metódus hív, kivételt eredményez. Előfordulhat például, hogy egy FileLoadException kivétel akkor jelenik meg, ha hiba történt egy műholdas szerelvény üzembe helyezésekor vagy telepítésekor, vagy SerializationException kivétel akkor fordulhat elő, ha egy felhasználó által definiált típus felhasználó által meghatározott kivételt ad a típus deszerializálásakor.

GetObject(String) módszer

A visszaadott erőforrás az aktuális szál felhasználói felületi kultúrájához van honosítva, amelyet a CultureInfo.CurrentUICulture tulajdonság határoz meg. Ha az erőforrás nincs az adott kultúrához honosítva, az erőforrás-kezelő tartalék szabályokkal tölt be egy megfelelő erőforrást. Ha nem található használható honosított erőforráskészlet, a ResourceManager az alapértelmezett kultúra erőforrásaira esik vissza. Ha az alapértelmezett kultúra erőforráskészlete nem található, a metódus MissingManifestResourceException kivételt eredményez, vagy ha az erőforráskészlet várhatóan egy műholdas szerelvényben található, MissingSatelliteAssemblyException kivételt. Ha az erőforrás-kezelő betölthet egy megfelelő erőforráskészletet, de nem talál egy namenevű erőforrást, a metódus nullad vissza.

Példa

Az alábbi példa a GetObject(String) metódust használja egy egyéni objektum deszerializálásához. A példa egy UIElements.cs nevű forráskódfájlt tartalmaz (UIElements.vb Visual Basic használata esetén), amely a következő, PersonTablenevű struktúrát határozza meg. Ezt a struktúrát egy általános táblázatmegjelenítési rutin használja, amely megjeleníti a táblázatoszlopok honosított nevét. Vegye figyelembe, hogy a PersonTable szerkezet SerializableAttribute attribútummal van megjelölve.

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

A következő kód egy CreateResources.cs (vagy a Visual Basic CreateResources.vb) nevű fájlból létrehoz egy UIResources.resx nevű XML-erőforrásfájlt, amely egy táblacímet és egy PersonTable objektumot tárol, amely az angol nyelvre honosított alkalmazás adatait tartalmazza.

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

A következő kód egy GetObject.cs (vagy GetObject.vb) nevű forráskódfájlban lekéri az erőforrásokat, és megjeleníti őket a konzolon.

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

Létrehozhatja a szükséges erőforrásfájlt és szerelvényeket, és futtathatja az alkalmazást az alábbi kötegfájl végrehajtásával. A /r opciót kell használnia, hogy a Resgen.exe számára egy hivatkozást adjon a UIElements.dll-ra, így az hozzáférhet a PersonTable struktúra információihoz. Ha C#-ot használ, cserélje le a vbc fordító nevét csc, és cserélje le a .vb bővítményt .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) módszer

A visszaadott erőforrás a cultureáltal megadott kultúrához, vagy a CultureInfo.CurrentUICulture tulajdonság által megadott kultúrához lesz honosítva, ha culturenull. Ha az erőforrás nincs az adott kultúrához honosítva, az erőforrás-kezelő tartalék szabályokkal tölt be egy megfelelő erőforrást. Ha nem található használható honosított erőforráskészlet, az erőforrás-kezelő visszaesik az alapértelmezett kultúra erőforrásaira. Ha az alapértelmezett kultúra erőforráskészlete nem található, a metódus MissingManifestResourceException kivételt eredményez, vagy ha az erőforráskészlet várhatóan egy műholdas szerelvényben található, MissingSatelliteAssemblyException kivételt. Ha az erőforrás-kezelő betölthet egy megfelelő erőforráskészletet, de nem talál egy namenevű erőforrást, a metódus nullad vissza.

Példa

Az alábbi példa a GetObject(String, CultureInfo) metódust használja egy egyéni objektum deszerializálásához. A példa tartalmaz egy NumberInfo.cs nevű forráskódfájlt (NumberInfo.vb Visual Basic használata esetén), amely a következő, Numbersnevű struktúrát határozza meg. Ezt a struktúrát egy egyszerű oktatási alkalmazás használja, amely megtanítja a nem angolul beszélő diákokat, hogy tízig számoljanak angolul. Vegye figyelembe, hogy a Numbers osztály SerializableAttribute attribútummal van megjelölve.

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

A következő forráskód egy CreateResources.cs nevű fájlból (CreateResources.vb a Visual Basichez) xml-erőforrásfájlokat hoz létre az alapértelmezett angol nyelvhez, valamint a francia, a portugál és az orosz nyelvhez.

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

Az erőforrásokat a következő alkalmazás használja fel, amely a jelenlegi felhasználói felületi kultúrát francia (Franciaország), portugál (Brazília) vagy orosz (Oroszország) nyelvre állítja. Meghívja a GetObject(String) metódust, hogy lekérjen egy honosított számokat tartalmazó Numbers objektumot, a GetObject(String, CultureInfo) metódust pedig egy angol nyelvű számokat tartalmazó Numbers objektum lekéréséhez. Ezután páratlan számokat jelenít meg az aktuális kezelőfelületi kultúra és az angol nyelv használatával. A forráskódfájl neve 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

A példa Visual Basic-verziójának létrehozásához és végrehajtásához az alábbi kötegfájlt használhatja. Ha C#-ot használ, cserélje le vbccsc, és cserélje le a .vb bővítményt .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

Teljesítménnyel kapcsolatos szempontok

Ha a GetObject metódust többször is ugyanazzal a name paraméterrel hívja meg, ne függjön attól, hogy a metódus minden híváskor ugyanarra az objektumra mutató hivatkozást ad vissza. Ennek az az oka, hogy a GetObject metódus vissza tudja adni a gyorsítótárban lévő meglévő erőforrás-objektumra mutató hivatkozást, vagy újra betöltheti az erőforrást, és egy új erőforrás-objektumra mutató hivatkozást adhat vissza.