ResourceManager.GetObject Yöntem
Tanım
Önemli
Bazı bilgiler ürünün ön sürümüyle ilgilidir ve sürüm öncesinde önemli değişiklikler yapılmış olabilir. Burada verilen bilgilerle ilgili olarak Microsoft açık veya zımni hiçbir garanti vermez.
Geçerli kültür için belirtilen dize olmayan kaynağın değerini döndürür.
Aşırı Yüklemeler
| Name | Description |
|---|---|
| GetObject(String) |
Belirtilen dize dışı kaynağın değerini döndürür. |
| GetObject(String, CultureInfo) |
Belirtilen kültür için yerelleştirilmiş belirtilen dize olmayan kaynağın değerini alır. |
GetObject(String)
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
Belirtilen dize dışı kaynağın değerini döndürür.
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
Parametreler
- name
- String
Alınacak kaynağın adı.
Döndürülenler
Çağıranın geçerli kültür ayarları için yerelleştirilmiş kaynağın değeri. Uygun bir kaynak kümesi varsa ancak name bulunamazsa, yöntemi döndürür null.
Özel durumlar
name parametresi null'dir.
Kullanılabilir yerelleştirilmiş kaynak kümesi bulunamadı ve varsayılan kültür kaynağı yok. Bu özel durumun nasıl işleneceğini öğrenmek için sınıf konusunun "MissingManifestResourceException ve MissingSatelliteAssemblyException Özel Durumlarını İşleme" bölümüne ResourceManager bakın.
Varsayılan kültürün kaynakları, bulunamayan bir uydu derlemesinde bulunur. Bu özel durumun nasıl işleneceğini öğrenmek için sınıf konusunun "MissingManifestResourceException ve MissingSatelliteAssemblyException Özel Durumlarını İşleme" bölümüne ResourceManager bakın.
Açıklamalar
GetObject yöntemi, dize olmayan kaynakları almak için kullanılır. Bunlar, Int32 veya Double gibi ilkel veri türlerine, System.Drawing.Bitmap nesnesi gibi bit eşlemlerine veya özel serileştirilmiş nesnelere ait değerleri içerir. Genellikle, döndürülen nesnenin uygun türde bir nesneye dönüştürülmesi (C# dilinde) veya dönüştürülmesi (Visual Basic'te) gerekir.
IgnoreCase özelliği, kaynak adlarıyla karşılaştırmasının name büyük/küçük harfe duyarsız mı yoksa büyük/küçük harfe duyarlı mı (varsayılan) olduğunu belirler.
Note
Bu yöntemler, listelenenden daha fazla özel durum oluşturabilir. Bunun nedenlerinden biri, bu yöntemin çağırmış olduğu bir yöntemin özel durum oluşturmasıdır. Örneğin, bir uydu bütünleştirme parçası dağıtılırken veya yüklenirken bir hata yapıldığında bir FileLoadException özel durumu fırlatılabilir veya kullanıcı tanımlı bir tür, seri durumdan çıkarılırken kullanıcı tanımlı bir özel durum fırlatırsa bir SerializationException özel durumu fırlatılabilir.
GetObject(String) yöntemi
Döndürülen kaynak, CultureInfo.CurrentUICulture özelliği tarafından tanımlanan geçerli iş parçacığının kullanıcı arabirimi kültürüne göre yerelleştirilmiştir. Kaynak bu kültür için yerelleştirilmemişse, kaynak yöneticisi uygun bir kaynağı yüklemek için geri dönüş kurallarını kullanır. Kullanılabilir yerelleştirilmiş kaynak kümesi bulunmazsa, ResourceManager varsayılan kültürün kaynaklarına geri döner. Varsayılan kültür için bir kaynak kümesi bulunamazsa, yöntemi bir MissingManifestResourceException özel durum oluşturur veya kaynak kümesinin bir uydu derlemesinde bulunması bekleniyorsa bir MissingSatelliteAssemblyException özel durum oluşturur. Kaynak yöneticisi uygun bir kaynak kümesi yükleyebiliyorsa ancak nameadlı bir kaynağı bulamıyorsa, yöntemi nulldöndürür.
Example
Aşağıdaki örnek, özel bir nesneyi seri durumdan çıkarmak için GetObject(String) yöntemini kullanır. Örnek, adlı PersonTableaşağıdaki yapıyı tanımlayan UIElements.cs adlı bir kaynak kod dosyası (Visual Basic kullanıyorsanız UIElements.vb) içerir. Bu yapı, tablo sütunlarının yerelleştirilmiş adlarını görüntüleyen genel bir tablo görüntüleme yordamı tarafından kullanılmak üzere tasarlanmıştır.
PersonTable yapısının SerializableAttribute özniteliğiyle işaretlendiğini unutmayın.
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
CreateResources.cs adlı bir dosyadan (veya Visual Basic için CreateResources.vb) aşağıdaki kod, bir tablo başlığını ve PersonTable İngilizce dili için yerelleştirilmiş bir uygulamanın bilgilerini içeren bir nesneyi depolayan UIResources.resx adlı bir XML kaynak dosyası oluşturur.
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
GetObject.cs (veya GetObject.vb) adlı bir kaynak kod dosyasındaki aşağıdaki kod, kaynakları alır ve konsolda görüntüler.
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
Aşağıdaki toplu iş dosyasını yürüterek gerekli kaynak dosyasını ve derlemeleri derleyebilir ve uygulamayı çalıştırabilirsiniz. Resgen.exe'ın, /r yapısı hakkındaki bilgilere erişebilmesi için UIElements.dll'e bir referans sağlamak amacıyla PersonTable seçeneğini kullanmanız gerekir. C# kullanıyorsanız, vbc derleyici adını csc ile değiştirin ve .vb uzantısını .cs ile değiştirin.
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) yöntemi
Döndürülen kaynak, culture tarafından belirtilen kültür veya CultureInfo.CurrentUICultureculture ise null özelliği tarafından belirtilen kültür için yerelleştirilir. Kaynak bu kültür için yerelleştirilmemişse, kaynak yöneticisi uygun bir kaynağı yüklemek için geri dönüş kurallarını kullanır. Kullanılabilir yerelleştirilmiş kaynak kümesi bulunmazsa, kaynak yöneticisi varsayılan kültürün kaynaklarına geri döner. Varsayılan kültür için bir kaynak kümesi bulunamazsa, yöntemi bir MissingManifestResourceException özel durum oluşturur veya kaynak kümesinin bir uydu derlemesinde bulunması bekleniyorsa bir MissingSatelliteAssemblyException özel durum oluşturur. Kaynak yöneticisi uygun bir kaynak kümesi yükleyebiliyorsa ancak nameadlı bir kaynağı bulamıyorsa, yöntemi nulldöndürür.
Example
Aşağıdaki örnek, özel bir nesneyi seri durumdan çıkarmak için GetObject(String, CultureInfo) yöntemini kullanır. Örnek, adlı Numbersaşağıdaki yapıyı tanımlayan NumberInfo.cs adlı bir kaynak kod dosyası (Visual Basic kullanıyorsanız NumberInfo.vb) içerir. Bu yapı, İngilizce konuşmayan öğrencilere İngilizce 10'a kadar saymayı öğreten basit bir eğitim uygulaması tarafından kullanılmak üzere tasarlanmıştır.
Numbers sınıfının özniteliğiyle SerializableAttribute işaretlendiğini unutmayın.
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
CreateResources.cs (Visual Basic için CreateResources.vb) adlı bir dosyadan alınan aşağıdaki kaynak kodu, varsayılan İngilizce ve Fransızca, Portekizce ve Rusça diller için XML kaynak dosyaları oluşturur.
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
Kaynaklar, geçerli kullanıcı arabirimi kültürünü Fransızca (Fransa), Portekizce (Brezilya) veya Rusça (Rusya) olarak ayarlayan aşağıdaki uygulama tarafından kullanılır.
GetObject(String) yöntemini, yerelleştirilmiş sayılar içeren bir Numbers nesnesi almak için ve GetObject(String, CultureInfo) yöntemini, İngilizce dil numaraları içeren bir Numbers nesnesi almak için çağırır. Ardından geçerli kullanıcı arabirimi kültürünü ve İngilizce dilini kullanarak tek sayılar görüntüler. Kaynak kod dosyası ShowNumbers.cs (ShowNumbers.vb) olarak adlandırılır.
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şağıdaki toplu iş dosyasını kullanarak örneğin Visual Basic sürümünü derleyebilir ve yürütebilirsiniz. C# kullanıyorsanız, vbc'yi csc ile ve .vb uzantısını .cs ile değiştirin.
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
Performansla ilgili dikkat edilmesi gerekenler
Aynı GetObject parametreyle name yöntemini birden çok kez çağırırsanız, yöntemin her çağrıda aynı nesneye başvuru döndüreceğine güvenmeyin. Bunun nedeni, yöntemin GetObject önbellekteki mevcut bir kaynak nesnesine başvuru döndürebileceği veya kaynağı yeniden yükleyip yeni bir kaynak nesnesine başvuru döndürebileceğidir.
Ayrıca bkz.
Şunlara uygulanır
GetObject(String, CultureInfo)
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
- Kaynak:
- ResourceManager.cs
Belirtilen kültür için yerelleştirilmiş belirtilen dize olmayan kaynağın değerini alır.
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
Parametreler
- name
- String
Alınacak kaynağın adı.
- culture
- CultureInfo
Kaynağın yerelleştirildiği kültür. Kaynak bu kültür için yerelleştirilmemişse, kaynak yöneticisi uygun bir kaynağı bulmak için geri dönüş kurallarını kullanır.
Bu değer isenullCultureInfo, nesnesi özelliği kullanılarak CurrentUICulture elde edilir.
Döndürülenler
Belirtilen kültür için yerelleştirilmiş kaynağın değeri. Uygun bir kaynak kümesi varsa ancak name bulunamazsa, yöntemi döndürür null.
Özel durumlar
name parametresi null'dir.
Kullanılabilir kaynak kümesi bulunamadı ve varsayılan kültür kaynağı yok. Bu özel durumun nasıl işleneceğini öğrenmek için sınıf konusunun "MissingManifestResourceException ve MissingSatelliteAssemblyException Özel Durumlarını İşleme" bölümüne ResourceManager bakın.
Varsayılan kültürün kaynakları, bulunamayan bir uydu derlemesinde bulunur. Bu özel durumun nasıl işleneceğini öğrenmek için sınıf konusunun "MissingManifestResourceException ve MissingSatelliteAssemblyException Özel Durumlarını İşleme" bölümüne ResourceManager bakın.
Açıklamalar
GetObject yöntemi, dize olmayan kaynakları almak için kullanılır. Bunlar, Int32 veya Double gibi ilkel veri türlerine, System.Drawing.Bitmap nesnesi gibi bit eşlemlerine veya özel serileştirilmiş nesnelere ait değerleri içerir. Genellikle, döndürülen nesnenin uygun türde bir nesneye dönüştürülmesi (C# dilinde) veya dönüştürülmesi (Visual Basic'te) gerekir.
IgnoreCase özelliği, kaynak adlarıyla karşılaştırmasının name büyük/küçük harfe duyarsız mı yoksa büyük/küçük harfe duyarlı mı (varsayılan) olduğunu belirler.
Note
Bu yöntemler, listelenenden daha fazla özel durum oluşturabilir. Bunun nedenlerinden biri, bu yöntemin çağırmış olduğu bir yöntemin özel durum oluşturmasıdır. Örneğin, bir uydu bütünleştirme parçası dağıtılırken veya yüklenirken bir hata yapıldığında bir FileLoadException özel durumu fırlatılabilir veya kullanıcı tanımlı bir tür, seri durumdan çıkarılırken kullanıcı tanımlı bir özel durum fırlatırsa bir SerializationException özel durumu fırlatılabilir.
GetObject(String) yöntemi
Döndürülen kaynak, CultureInfo.CurrentUICulture özelliği tarafından tanımlanan geçerli iş parçacığının kullanıcı arabirimi kültürüne göre yerelleştirilmiştir. Kaynak bu kültür için yerelleştirilmemişse, kaynak yöneticisi uygun bir kaynağı yüklemek için geri dönüş kurallarını kullanır. Kullanılabilir yerelleştirilmiş kaynak kümesi bulunmazsa, ResourceManager varsayılan kültürün kaynaklarına geri döner. Varsayılan kültür için bir kaynak kümesi bulunamazsa, yöntemi bir MissingManifestResourceException özel durum oluşturur veya kaynak kümesinin bir uydu derlemesinde bulunması bekleniyorsa bir MissingSatelliteAssemblyException özel durum oluşturur. Kaynak yöneticisi uygun bir kaynak kümesi yükleyebiliyorsa ancak nameadlı bir kaynağı bulamıyorsa, yöntemi nulldöndürür.
Example
Aşağıdaki örnek, özel bir nesneyi seri durumdan çıkarmak için GetObject(String) yöntemini kullanır. Örnek, adlı PersonTableaşağıdaki yapıyı tanımlayan UIElements.cs adlı bir kaynak kod dosyası (Visual Basic kullanıyorsanız UIElements.vb) içerir. Bu yapı, tablo sütunlarının yerelleştirilmiş adlarını görüntüleyen genel bir tablo görüntüleme yordamı tarafından kullanılmak üzere tasarlanmıştır.
PersonTable yapısının SerializableAttribute özniteliğiyle işaretlendiğini unutmayın.
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
CreateResources.cs adlı bir dosyadan (veya Visual Basic için CreateResources.vb) aşağıdaki kod, bir tablo başlığını ve PersonTable İngilizce dili için yerelleştirilmiş bir uygulamanın bilgilerini içeren bir nesneyi depolayan UIResources.resx adlı bir XML kaynak dosyası oluşturur.
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
GetObject.cs (veya GetObject.vb) adlı bir kaynak kod dosyasındaki aşağıdaki kod, kaynakları alır ve konsolda görüntüler.
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
Aşağıdaki toplu iş dosyasını yürüterek gerekli kaynak dosyasını ve derlemeleri derleyebilir ve uygulamayı çalıştırabilirsiniz. Resgen.exe'ın, /r yapısı hakkındaki bilgilere erişebilmesi için UIElements.dll'e bir referans sağlamak amacıyla PersonTable seçeneğini kullanmanız gerekir. C# kullanıyorsanız, vbc derleyici adını csc ile değiştirin ve .vb uzantısını .cs ile değiştirin.
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) yöntemi
Döndürülen kaynak, culture tarafından belirtilen kültür veya CultureInfo.CurrentUICultureculture ise null özelliği tarafından belirtilen kültür için yerelleştirilir. Kaynak bu kültür için yerelleştirilmemişse, kaynak yöneticisi uygun bir kaynağı yüklemek için geri dönüş kurallarını kullanır. Kullanılabilir yerelleştirilmiş kaynak kümesi bulunmazsa, kaynak yöneticisi varsayılan kültürün kaynaklarına geri döner. Varsayılan kültür için bir kaynak kümesi bulunamazsa, yöntemi bir MissingManifestResourceException özel durum oluşturur veya kaynak kümesinin bir uydu derlemesinde bulunması bekleniyorsa bir MissingSatelliteAssemblyException özel durum oluşturur. Kaynak yöneticisi uygun bir kaynak kümesi yükleyebiliyorsa ancak nameadlı bir kaynağı bulamıyorsa, yöntemi nulldöndürür.
Example
Aşağıdaki örnek, özel bir nesneyi seri durumdan çıkarmak için GetObject(String, CultureInfo) yöntemini kullanır. Örnek, adlı Numbersaşağıdaki yapıyı tanımlayan NumberInfo.cs adlı bir kaynak kod dosyası (Visual Basic kullanıyorsanız NumberInfo.vb) içerir. Bu yapı, İngilizce konuşmayan öğrencilere İngilizce 10'a kadar saymayı öğreten basit bir eğitim uygulaması tarafından kullanılmak üzere tasarlanmıştır.
Numbers sınıfının özniteliğiyle SerializableAttribute işaretlendiğini unutmayın.
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
CreateResources.cs (Visual Basic için CreateResources.vb) adlı bir dosyadan alınan aşağıdaki kaynak kodu, varsayılan İngilizce ve Fransızca, Portekizce ve Rusça diller için XML kaynak dosyaları oluşturur.
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
Kaynaklar, geçerli kullanıcı arabirimi kültürünü Fransızca (Fransa), Portekizce (Brezilya) veya Rusça (Rusya) olarak ayarlayan aşağıdaki uygulama tarafından kullanılır.
GetObject(String) yöntemini, yerelleştirilmiş sayılar içeren bir Numbers nesnesi almak için ve GetObject(String, CultureInfo) yöntemini, İngilizce dil numaraları içeren bir Numbers nesnesi almak için çağırır. Ardından geçerli kullanıcı arabirimi kültürünü ve İngilizce dilini kullanarak tek sayılar görüntüler. Kaynak kod dosyası ShowNumbers.cs (ShowNumbers.vb) olarak adlandırılır.
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şağıdaki toplu iş dosyasını kullanarak örneğin Visual Basic sürümünü derleyebilir ve yürütebilirsiniz. C# kullanıyorsanız, vbc'yi csc ile ve .vb uzantısını .cs ile değiştirin.
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
Performansla ilgili dikkat edilmesi gerekenler
Aynı GetObject parametreyle name yöntemini birden çok kez çağırırsanız, yöntemin her çağrıda aynı nesneye başvuru döndüreceğine güvenmeyin. Bunun nedeni, yöntemin GetObject önbellekteki mevcut bir kaynak nesnesine başvuru döndürebileceği veya kaynağı yeniden yükleyip yeni bir kaynak nesnesine başvuru döndürebileceğidir.
İş Parçacığı Güvenliği
GetObject(String, CultureInfo) yöntemi iş parçacığı güvenlidir.