System.Resources.ResourceManager.GetObject-Methoden

Dieser Artikel enthält ergänzende Hinweise zur Referenzdokumentation für diese API.

Die GetObject Methode wird verwendet, um Ressourcen ohne Zeichenfolge abzurufen. Dazu gehören Werte, die zu primitiven Datentypen gehören, z Int32Double. B. Bitmaps (z. B. ein System.Drawing.Bitmap Objekt) oder benutzerdefinierte serialisierte Objekte. In der Regel muss das zurückgegebene Objekt (in C#) umgewandelt oder (in Visual Basic) in ein Objekt des entsprechenden Typs konvertiert werden.

Die IgnoreCase Eigenschaft bestimmt, ob bei dem Vergleich name mit den Namen von Ressourcen die Groß-/Kleinschreibung nicht beachtet wird (Standard).

Hinweis

Diese Methoden können mehr Ausnahmen auslösen, als aufgelistet sind. Ein Grund hierfür kann sein, wenn eine Methode, die von dieser Methode aufgerufen wird, eine Ausnahme auslöst. Eine Ausnahme kann beispielsweise ausgelöst werden, FileLoadException wenn beim Bereitstellen oder Installieren einer Satellitenassembly ein Fehler aufgetreten ist oder eine SerializationException Ausnahme ausgelöst wird, wenn ein benutzerdefinierter Typ eine benutzerdefinierte Ausnahme auslöst, wenn der Typ deserialisiert wird.

GetObject(String)-Methode

Die zurückgegebene Ressource wird für die Benutzeroberflächenkultur des aktuellen Threads lokalisiert, die von der CultureInfo.CurrentUICulture Eigenschaft definiert wird. Wenn die Ressource für diese Kultur nicht lokalisiert ist, verwendet der Ressourcen-Manager Fallbackregeln, um eine entsprechende Ressource zu laden. Wenn keine verwendbare Gruppe lokalisierter Ressourcen gefunden wird, greift dies ResourceManager auf die Ressourcen der Standardkultur zurück. Wenn eine Ressource, die für die Standardkultur festgelegt ist, nicht gefunden wird, löst die Methode eine MissingManifestResourceException Ausnahme aus oder, wenn der Ressourcensatz in einer Satellitenassembly erwartet wird, eine MissingSatelliteAssemblyException Ausnahme. Wenn der Ressourcen-Manager einen geeigneten Ressourcensatz laden kann, aber keine Ressource mit dem Namen namefinden kann, gibt die Methode zurück null.

Beispiel

Im folgenden Beispiel wird die GetObject(String) -Methode verwendet, um ein benutzerdefiniertes Objekt zu deserialisieren. Das Beispiel enthält eine Quellcodedatei mit dem Namen UIElements.cs (UIElements.vb, wenn Sie Visual Basic verwenden), die die folgende Struktur mit dem Namen PersonTabledefiniert. Diese Struktur soll von einer allgemeinen Tabellen-Anzeigeroutine verwendet werden, die den lokalisierten Namen der Tabellenspalten anzeigt. Beachten Sie, dass die PersonTable -Struktur ist mit dem SerializableAttribute -Attribut gekennzeichnet ist.

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

Der folgende Code aus einer Datei mit dem Namen CreateResources.cs (oder CreateResources.vb für Visual Basic) erstellt eine XML-Ressourcendatei namens "UIResources.resx", die einen Tabellentitel und ein PersonTable Objekt speichert, das Informationen für eine App enthält, die für die englische Sprache lokalisiert ist.

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

Der folgende Code in einer Quellcodedatei mit dem Namen GetObject.cs (oder GetObject.vb) ruft dann die Ressourcen ab und zeigt sie in der Konsole an.

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

Mit der folgenden Batchdatei können Sie die erforderliche Ressourcendatei und Assemblys erstellen und die App ausführen. Verwenden Sie die Option /r , um Resgen.exe einen Verweis auf UIElements.dll bereitzustellen, damit die Anwendung Zugriff auf Informationen über die PersonTable -Struktur erhält. Wenn Sie C# verwenden, ersetzen Sie den vbc -Compilernamen mit cscund ersetzen Sie die .vb -Erweiterung mit .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)-Methode

Die zurückgegebene Ressource wird für die Kultur lokalisiert, die angegeben culturewird, oder für die Kultur, die von der CultureInfo.CurrentUICulture Eigenschaft angegeben wird, falls culture vorhanden null. Wenn die Ressource für diese Kultur nicht lokalisiert ist, verwendet der Ressourcen-Manager Fallbackregeln, um eine entsprechende Ressource zu laden. Wenn keine verwendbare Gruppe lokalisierter Ressourcen gefunden wird, greift der Ressourcen-Manager auf die Ressourcen der Standardkultur zurück. Wenn eine Ressource, die für die Standardkultur festgelegt ist, nicht gefunden wird, löst die Methode eine MissingManifestResourceException Ausnahme aus oder, wenn der Ressourcensatz in einer Satellitenassembly erwartet wird, eine MissingSatelliteAssemblyException Ausnahme. Wenn der Ressourcen-Manager einen geeigneten Ressourcensatz laden kann, aber keine Ressource mit dem Namen namefinden kann, gibt die Methode zurück null.

Beispiel

Im folgenden Beispiel wird die GetObject(String, CultureInfo) -Methode verwendet, um ein benutzerdefiniertes Objekt zu deserialisieren. Das Beispiel enthält eine Quellcodedatei mit dem Namen NumberInfo.cs (NumberInfo.vb, wenn Sie Visual Basic verwenden), die die folgende Struktur mit dem Namen Numbersdefiniert. Diese Struktur soll von einer einfachen Bildungs-App verwendet werden, die nicht englischsprachige Schüler unterrichtet, um auf zehn in Englisch zu zählen. Beachten Sie, dass die Numbers Klasse mit dem SerializableAttribute Attribut gekennzeichnet ist.

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

Der folgende Quellcode aus einer Datei mit dem Namen CreateResources.cs (CreateResources.vb für Visual Basic) erstellt XML-Ressourcendateien für die Standardsprache Englisch sowie für die Sprachen Französisch, Portugiesisch und Russisch.

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

Die Ressourcen werden von der folgenden App genutzt, die die aktuelle Benutzeroberflächenkultur auf Französisch (Frankreich), Portugiesisch (Brasilien) oder Russisch (Russland) festlegt. Sie ruft die GetObject(String) Methode auf, um ein Numbers Objekt abzurufen, das lokalisierte Zahlen enthält, und die GetObject(String, CultureInfo) Methode, um ein Numbers Objekt abzurufen, das englische Sprachnummern enthält. Anschließend werden ungerade Zahlen mit der aktuellen Benutzeroberflächenkultur und der englischen Sprache angezeigt. Die Quellcodedatei heißt 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

Sie können die folgende Batchdatei verwenden, um die Visual Basic-Version des Beispiels zu erstellen und auszuführen. Wenn Sie C# verwenden, ersetzen Sie vbc die Erweiterung durch csc, und ersetzen Sie sie .vb durch .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

Überlegungen zur Leistung

Wenn Sie die GetObject Methode mehrmals mit demselben name Parameter aufrufen, hängen Sie nicht von der Methode ab, die einen Verweis auf dasselbe Objekt mit jedem Aufruf zurückgibt. Dies liegt daran, dass die GetObject Methode einen Verweis auf ein vorhandenes Ressourcenobjekt in einem Cache zurückgeben kann, oder sie kann die Ressource neu laden und einen Verweis auf ein neues Ressourcenobjekt zurückgeben.