回答:
グローバリゼーションが考慮されるようにするには、常にリソースマネージャーを使用し、ファイルを直接読み取らないでください。
using System.Collections;
using System.Globalization;
using System.Resources;
...
/* Reference to your resources class -- may be named differently in your case */
ResourceManager MyResourceClass =
new ResourceManager(typeof(Resources));
ResourceSet resourceSet =
MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value;
}
ResourceManager MyResourceClass = new ResourceManager("Resources.ResourceFileName", System.Reflection.Assembly.Load("App_GlobalResources"));
私のブログでそれについてブログに書いてあります :)ショートバージョンは、リソースの完全な名前を見つけることです(あなたがすでにそれらを知っているのでない限り):
var assembly = Assembly.GetExecutingAssembly();
foreach (var resourceName in assembly.GetManifestResourceNames())
System.Console.WriteLine(resourceName);
それらすべてを何かに使用するには:
foreach (var resourceName in assembly.GetManifestResourceNames())
{
using(var stream = assembly.GetManifestResourceStream(resourceName))
{
// Do something with stream
}
}
実行中のアセンブリ以外のアセンブリでリソースを使用するには、Assembly
クラスの他の静的メソッドのいくつかを使用して、別のアセンブリオブジェクトを取得します。それが役に立てば幸い :)
ResXResourceReader rsxr = new ResXResourceReader("your resource file path");
// Iterate through the resources and display the contents to the console.
foreach (DictionaryEntry d in rsxr)
{
Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
}
// Create a ResXResourceReader for the file items.resx.
ResXResourceReader rsxr = new ResXResourceReader("items.resx");
// Create an IDictionaryEnumerator to iterate through the resources.
IDictionaryEnumerator id = rsxr.GetEnumerator();
// Iterate through the resources and display the contents to the console.
foreach (DictionaryEntry d in rsxr)
{
Console.WriteLine(d.Key.ToString() + ":\t" + d.Value.ToString());
}
//Close the reader.
rsxr.Close();
リンクを参照してください:マイクロソフトの例
System.Windows.Forms
アセンブリ内にあり、MVCアプリを使用している場合は自動的に追加されないことに注意してください
リソース.RESXファイルをプロジェクトに追加すると、Visual Studioは同じ名前のDesigner.csを作成し、リソースのすべての項目を静的プロパティとしてクラスを作成します。リソースファイルの名前を入力した後、エディターでドットを入力すると、リソースのすべての名前が表示されます。
または、リフレクションを使用してこれらの名前をループできます。
Type resourceType = Type.GetType("AssemblyName.Resource1");
PropertyInfo[] resourceProps = resourceType.GetProperties(
BindingFlags.NonPublic |
BindingFlags.Static |
BindingFlags.GetProperty);
foreach (PropertyInfo info in resourceProps)
{
string name = info.Name;
object value = info.GetValue(null, null); // object can be an image, a string whatever
// do something with name and value
}
この方法は明らかに、RESXファイルが現在のアセンブリまたはプロジェクトのスコープ内にある場合にのみ使用できます。それ以外の場合は、「pulse」によって提供されるメソッドを使用します。
このメソッドの利点は、必要に応じてローカリゼーションを考慮して、提供されている実際のプロパティを呼び出すことです。ただし、通常はリソースのプロパティを呼び出すタイプセーフなダイレクトメソッドを使用する必要があるため、かなり冗長です。
ResourceManager.GetResourceSetを使用できます。
LINQを使用する場合は、を使用しますresourceSet.OfType<DictionaryEntry>()
。LINQを使用すると、たとえば、キー(文字列)ではなくインデックス(int)に基づいてリソースを選択できます。
ResourceSet resourceSet = Resources.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (var entry in resourceSet.OfType<DictionaryEntry>().Select((item, i) => new { Index = i, Key = item.Key, Value = item.Value }))
{
Console.WriteLine(@"[{0}] {1}", entry.Index, entry.Key);
}
nugetパッケージSystem.Resources.ResourceManager
(v4.3.0)では、ResourceSet
およびResourceManager.GetResourceSet
は使用できません。
ResourceReader
この投稿で提案されているように、「C#-ResourceManagerから(サテライトアセンブリから)文字列を取得できません」
リソースファイルのキー/値を読み取ることは引き続き可能です。
System.Reflection.Assembly resourceAssembly = System.Reflection.Assembly.Load(new System.Reflection.AssemblyName("YourAssemblyName"));
String[] manifests = resourceAssembly.GetManifestResourceNames();
using (ResourceReader reader = new ResourceReader(resourceAssembly.GetManifestResourceStream(manifests[0])))
{
System.Collections.IDictionaryEnumerator dict = reader.GetEnumerator();
while (dict.MoveNext())
{
String key = dict.Key as String;
String value = dict.Value as String;
}
}
使用してSQLにLINQを:
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");