Bagikan melalui


Metode System.Resources.ResourceManager.GetObject

Artikel ini menyediakan keterangan tambahan untuk dokumentasi referensi untuk API ini.

Metode GetObject ini digunakan untuk mengambil sumber daya non-string. Ini termasuk nilai milik jenis data primitif seperti Int32 atau Double, bitmap (seperti System.Drawing.Bitmap objek), atau objek berseri kustom. Biasanya, objek yang dikembalikan harus ditransmisikan (dalam C#) atau dikonversi (di Visual Basic) ke objek dengan jenis yang sesuai.

Properti IgnoreCase menentukan apakah perbandingan name dengan nama sumber daya tidak peka huruf besar/kecil atau peka huruf besar/kecil (default).

Catatan

Metode ini dapat memberikan lebih banyak pengecualian daripada yang tercantum. Salah satu alasan ini mungkin terjadi adalah jika metode yang dipanggil metode ini melemparkan pengecualian. Misalnya, FileLoadException pengecualian dapat dilemparkan jika kesalahan dibuat menyebarkan atau menginstal rakitan satelit, atau SerializationException pengecualian mungkin dilemparkan jika jenis yang ditentukan pengguna melemparkan pengecualian yang ditentukan pengguna saat jenis dideserialisasi.

metode GetObject(String)

Sumber daya yang dikembalikan dilokalkan untuk budaya UI dari utas saat ini, yang ditentukan oleh CultureInfo.CurrentUICulture properti . Jika sumber daya tidak dilokalkan untuk budaya tersebut, resource manager menggunakan aturan fallback untuk memuat sumber daya yang sesuai. Jika tidak ada sekumpulan sumber daya lokal yang dapat digunakan yang ditemukan, ResourceManager kejatuhan kembali pada sumber daya budaya default. Jika sumber daya yang ditetapkan untuk budaya default tidak ditemukan, metode melempar MissingManifestResourceException pengecualian atau, jika set sumber daya diharapkan berada di perakitan satelit, pengecualian MissingSatelliteAssemblyException . Jika resource manager dapat memuat set sumber daya yang sesuai tetapi tidak dapat menemukan sumber daya bernama name, metode mengembalikan null.

Contoh

Contoh berikut menggunakan GetObject(String) metode untuk mendeserialisasi objek kustom. Contohnya mencakup file kode sumber bernama UIElements.cs (UIElements.vb jika Anda menggunakan Visual Basic) yang menentukan struktur berikut bernama PersonTable. Struktur ini dimaksudkan untuk digunakan oleh rutinitas tampilan tabel umum yang menampilkan nama kolom tabel yang dilokalkan. Perhatikan bahwa PersonTable struktur ditandai dengan SerializableAttribute atribut .

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

Kode berikut dari file bernama CreateResources.cs (atau CreateResources.vb untuk Visual Basic) membuat file sumber daya XML bernama UIResources.resx yang menyimpan judul tabel dan PersonTable objek yang berisi informasi untuk aplikasi yang dilokalkan untuk bahasa Inggris.

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

Kode berikut dalam file kode sumber bernama GetObject.cs (atau GetObject.vb) kemudian mengambil sumber daya dan menampilkannya ke konsol.

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

Anda dapat membangun file sumber daya dan rakitan yang diperlukan dan menjalankan aplikasi dengan menjalankan file batch berikut. Anda harus menggunakan /r opsi untuk menyediakan Resgen.exe dengan referensi ke UIElements.dll sehingga dapat mengakses informasi tentang PersonTable struktur. Jika Anda menggunakan C#, ganti vbc nama pengkompilasi dengan csc, dan ganti .vb ekstensi dengan .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

metode GetObject(String, CultureInfo)

Sumber daya yang dikembalikan dilokalkan untuk budaya yang ditentukan oleh culture, atau untuk budaya yang ditentukan oleh CultureInfo.CurrentUICulture properti jika culture adalah null. Jika sumber daya tidak dilokalkan untuk budaya tersebut, resource manager menggunakan aturan fallback untuk memuat sumber daya yang sesuai. Jika tidak ada sekumpulan sumber daya lokal yang dapat digunakan yang ditemukan, resource manager akan kembali pada sumber daya budaya default. Jika sumber daya yang ditetapkan untuk budaya default tidak ditemukan, metode melempar MissingManifestResourceException pengecualian atau, jika set sumber daya diharapkan berada di perakitan satelit, pengecualian MissingSatelliteAssemblyException . Jika resource manager dapat memuat set sumber daya yang sesuai tetapi tidak dapat menemukan sumber daya bernama name, metode mengembalikan null.

Contoh

Contoh berikut menggunakan GetObject(String, CultureInfo) metode untuk mendeserialisasi objek kustom. Contohnya mencakup file kode sumber bernama NumberInfo.cs (NumberInfo.vb jika Anda menggunakan Visual Basic) yang menentukan struktur berikut bernama Numbers. Struktur ini dimaksudkan untuk digunakan oleh aplikasi pendidikan sederhana yang mengajarkan siswa non-bahasa Inggris untuk dihitung hingga sepuluh dalam bahasa Inggris. Perhatikan bahwa Numbers kelas ditandai dengan SerializableAttribute atribut .

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

Kode sumber berikut dari file bernama CreateResources.cs (CreateResources.vb untuk Visual Basic) membuat file sumber daya XML untuk bahasa Inggris default, serta untuk bahasa Prancis, Portugis, dan Rusia.

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

Sumber daya dikonsumsi oleh aplikasi berikut, yang menetapkan budaya UI saat ini ke Prancis (Prancis), Portugis (Brasil), atau Rusia (Rusia). Ini memanggil GetObject(String) metode untuk mendapatkan Numbers objek yang berisi nomor yang dilokalkan dan GetObject(String, CultureInfo) metode untuk mendapatkan Numbers objek yang berisi nomor bahasa Inggris. Kemudian menampilkan angka ganjil menggunakan budaya UI saat ini dan bahasa Inggris. File kode sumber diberi nama 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

Anda dapat menggunakan file batch berikut untuk membangun dan menjalankan versi Visual Basic dari contoh. Jika Anda menggunakan C#, ganti vbc dengan csc, dan ganti .vb ekstensi dengan .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

Pertimbangan performa

Jika Anda memanggil GetObject metode beberapa kali dengan parameter yang sama name , jangan bergantung pada metode yang mengembalikan referensi ke objek yang sama dengan setiap panggilan. Ini karena GetObject metode dapat mengembalikan referensi ke objek sumber daya yang ada dalam cache, atau dapat memuat ulang sumber daya dan mengembalikan referensi ke objek sumber daya baru.