ResourceManager.GetObject メソッド
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
現在のカルチャの文字列以外の指定したリソースの値を返します。
オーバーロード
GetObject(String) |
指定した文字列以外のリソースの値を返します。 |
GetObject(String, CultureInfo) |
指定されたカルチャ用にローカライズされている指定された文字列以外のリソースの値を取得します。 |
GetObject(String)
指定した文字列以外のリソースの値を返します。
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
パラメーター
- name
- String
取得するリソースの名前。
戻り値
呼び出し元の現在のカルチャ用にローカライズされているリソースの値。 適切なリソース セットが存在するが、name
が見つからない場合、メソッドは null
を返します。
例外
name
パラメーターが null
です。
使用できるローカライズされたリソースのセットが見つからず、既定のカルチャ リソースもありません。 この例外の処理方法の詳細については、ResourceManager クラスのトピックの MissingManifestResourceException 例外と MissingSatelliteAssemblyException 例外の処理に関するセクションを参照してください。
既定のカルチャのリソースがサテライト アセンブリに存在し、そのサテライト アセンブリが見つかりませんでした。 この例外の処理方法の詳細については、ResourceManager クラスのトピックの MissingManifestResourceException 例外と MissingSatelliteAssemblyException 例外の処理に関するセクションを参照してください。
例
次の例では、 GetObject(String) メソッドを使用して、カスタム オブジェクトを逆シリアル化します。 この例には、UIElements.cs (Visual Basic を使用している場合は UIElements.vb) という名前のソース コード ファイルが含まれており、次の名前のPersonTable
構造体を定義します。 この構造体は、ローカライズされたテーブル列名を表示する一般的なテーブル表示ルーチンでの使用を目的としています。 PersonTable
構造体は、 SerializableAttribute 属性でマークされています。
using System;
[Serializable] public struct PersonTable
{
public readonly int nColumns;
public readonly string column1;
public readonly string column2;
public readonly string column3;
public readonly int width1;
public readonly int width2;
public readonly int width3;
public PersonTable(string column1, string column2, string column3,
int width1, int width2, int width3)
{
this.column1 = column1;
this.column2 = column2;
this.column3 = column3;
this.width1 = width1;
this.width2 = width2;
this.width3 = width3;
this.nColumns = typeof(PersonTable).GetFields().Length / 2;
}
}
<Serializable> Public Structure PersonTable
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 (Visual Basic の場合は CreateResources.vb) という名前のファイルに入っている次のコードは、UIResources.resx という名前の XML リソース ファイルを作成します。このリソース ファイルには、テーブルのタイトルに加えて、英語にローカライズされたアプリに関する情報を含む PersonTable
オブジェクトが格納されます。
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 CreateResource
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 (GetObject.vb) という名前のソース コード ファイルに含まれる次のコードは、リソースを取得し、コンソールに表示します。
using System;
using System.Resources;
[assembly: NeutralResourcesLanguageAttribute("en")]
public class Example
{
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
次のバッチ ファイルを実行することで、必要なリソース ファイルとアセンブリをビルドし、アプリケーションを実行することができます。 /r
構造体に関する情報にアクセスできるように、 PersonTable
オプションを使用して Resgen.exe を指定し、UIElements.dll への参照を含める必要があります。 C# を使用している場合は、 vbc
コンパイラ名を csc
に置換し、 .vb
拡張子を .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 メソッドは、文字列以外のリソースを取得するために使用されます。 これには、ビットマップ (オブジェクトなど)、カスタム シリアル化されたオブジェクトなどのInt32Doubleプリミティブ データ型に属する値が含System.Drawing.Bitmapまれます。 通常、返されるオブジェクトは(C#で) キャストするか、(Visual Basicで) 適切な型のオブジェクトに変換する必要があります。
返されるリソースは、プロパティによって定義される現在のスレッドの UI カルチャ用に CultureInfo.CurrentUICulture ローカライズされます。 リソースがそのカルチャにローカライズされていない場合、リソース マネージャーはフォールバック ルールを使用して適切なリソースを読み込みます。 ローカライズされたリソースの使用可能なセットが見つからない場合は、既定の ResourceManager カルチャのリソースにフォールバックします。 既定のカルチャのリソース セットが見つからない場合、メソッドは例外を MissingManifestResourceException スローするか、リソース セットがサテライト アセンブリに存在することが予想される場合は例外を MissingSatelliteAssemblyException スローします。 リソース マネージャーが適切なリソース セットを読み込むことができるが、名前の付いた name
リソースが見つからない場合、メソッドは返します null
。
このプロパティは IgnoreCase 、リソース名との比較 name
で大文字と小文字が区別されるか、大文字と小文字が区別されるか (既定値) を決定します。
注意事項
このメソッドは、一覧よりも多くの例外をスローする可能性があります。 これが発生する理由の 1 つは、このメソッドが呼び出すメソッドが例外をスローした場合です。 たとえば、サテライト アセンブリの FileLoadException 配置またはインストール中にエラーが発生した場合に例外がスローされる場合や SerializationException 、型が逆シリアル化されたときにユーザー定義型がユーザー定義例外をスローした場合に例外がスローされる場合があります。
パフォーマンスに関する考慮事項
同じパラメーターでメソッドを GetObject 複数回呼び出す場合は、呼 name
び出しごとに同じオブジェクトへの参照を返すメソッドに依存しないでください。 これは、メソッドがキャッシュ内の GetObject 既存のリソース オブジェクトへの参照を返したり、リソースを再読み込みして新しいリソース オブジェクトへの参照を返したりできるためです。
こちらもご覧ください
適用対象
GetObject(String, CultureInfo)
指定されたカルチャ用にローカライズされている指定された文字列以外のリソースの値を取得します。
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
パラメーター
- name
- String
取得するリソースの名前。
- culture
- CultureInfo
リソースのローカライズ対象のカルチャ。 リソースがこのカルチャにローカライズされていない場合、リソース マネージャーはフォールバック規則を使用して適切なリソースを探します。
この値が null
の場合、CurrentUICulture プロパティを使用して CultureInfo オブジェクトが取得されます。
戻り値
指定されたカルチャに合わせてローカライズされているリソースの値。 適切なリソース セットが存在するが、name
が見つからない場合、メソッドは null
を返します。
例外
name
パラメーターが null
です。
使用できるリソースのセットが見つからず、既定のカルチャ リソースもありません。 この例外の処理方法の詳細については、ResourceManager クラスのトピックの MissingManifestResourceException 例外と MissingSatelliteAssemblyException 例外の処理に関するセクションを参照してください。
既定のカルチャのリソースがサテライト アセンブリに存在し、そのサテライト アセンブリが見つかりませんでした。 この例外の処理方法の詳細については、ResourceManager クラスのトピックの MissingManifestResourceException 例外と MissingSatelliteAssemblyException 例外の処理に関するセクションを参照してください。
例
次の例では、 GetObject(String, CultureInfo) メソッドを使用して、カスタム オブジェクトを逆シリアル化します。 この例には、NumberInfo.cs (Visual Basic を使用している場合は NumberInfo.vb) という名前のソース コード ファイルが含まれており、次の構造体Numbers
を定義しています。 この構造は、英語を話していない学生が英語で10にカウントするように教える簡単な教育アプリで使用されることを意図しています。 クラスは Numbers
属性でマークされていることに SerializableAttribute 注意してください。
using System;
[Serializable] public class Numbers
{
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 Numbers(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 Numbers
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 の場合は CreateResources.vb) という名前のファイルの次のソース コードは、既定の英語とフランス語、ポルトガル語、ロシア語の言語の XML リソース ファイルを作成します。
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
リソースは、現在の UI カルチャをフランス語 (フランス)、ポルトガル語 (ブラジル)、ロシア語 (ロシア) に設定する次のアプリによって消費されます。 このメソッドを GetObject(String) 呼び出して、 Numbers
ローカライズされた番号を含むオブジェクトを取得し、 GetObject(String, CultureInfo) 英語の言語番号を含むオブジェクトを Numbers
取得するメソッドを呼び出します。 次に、現在の UI カルチャと英語を使用して奇数を表示します。 ソース コード ファイルの名前は 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
<assembly:NeutralResourcesLanguageAttribute("en-US")>
Module Example
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
次のバッチ ファイルを使用して、Visual Basic バージョンの例をビルドして実行できます。 C# を使用している場合は、次のようにcsc
置き換えvbc
、拡張機能.cs
を .vb
.
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
注釈
この GetObject(String, CultureInfo) メソッドは、文字列以外のリソースを取得するために使用されます。 これには、ビットマップ (オブジェクトなど)、カスタム シリアル化されたオブジェクトなどのInt32Doubleプリミティブ データ型に属する値が含System.Drawing.Bitmapまれます。 通常、返されるオブジェクトは(C#で) キャストするか、(Visual Basicで) 適切な型のオブジェクトに変換する必要があります。
返されるリソースは、指定されたカルチャ、またはプロパティでculture
CultureInfo.CurrentUICulture指定されているカルチャの場合culture``null
はローカライズされます。 リソースがそのカルチャにローカライズされていない場合、リソース マネージャーはフォールバック ルールを使用して適切なリソースを読み込みます。 ローカライズされたリソースの使用可能なセットが見つからない場合、リソース マネージャーは既定のカルチャのリソースにフォールバックします。 既定のカルチャのリソース セットが見つからない場合、メソッドは例外を MissingManifestResourceException スローするか、リソース セットがサテライト アセンブリに存在することが予想される場合は例外を MissingSatelliteAssemblyException スローします。 リソース マネージャーが適切なリソース セットを読み込むことができるが、名前の付いた name
リソースが見つからない場合、メソッドは返します null
。
このプロパティは IgnoreCase 、リソース名との比較 name
で大文字と小文字を区別しない (既定) か、大文字と小文字を区別するかを決定します。
注意事項
このメソッドは、一覧よりも多くの例外をスローする可能性があります。 これが発生する理由の 1 つは、このメソッドが呼び出すメソッドが例外をスローした場合です。 たとえば、サテライト アセンブリの FileLoadException 配置またはインストール中にエラーが発生した場合に例外がスローされる場合や SerializationException 、型が逆シリアル化されたときにユーザー定義型がユーザー定義例外をスローした場合に例外がスローされる場合があります。
パフォーマンスに関する考慮事項
同じパラメーターでメソッドを GetObject 複数回呼び出す場合は、呼 name
び出しごとに同じオブジェクトへの参照を返すメソッドに依存しないでください。 これは、メソッドがキャッシュ内の GetObject 既存のリソース オブジェクトへの参照を返したり、リソースを再読み込みして新しいリソース オブジェクトへの参照を返したりできるためです。
スレッド セーフ
GetObject(String, CultureInfo)このメソッドはスレッド セーフです。