C#で.resx
ファイル内のすべてのリソースをループする方法はありますか?
グローバリゼーションが考慮されるように、ファイルを直接読み取らないで、常にリソースマネージャーを使用する必要があります。
using System.Collections;
using System.Globalization;
using System.Resources;
...
ResourceManager MyResourceClass = new ResourceManager(typeof(Resources /* Reference to your resources class -- may be named differently in your case */));
ResourceSet resourceSet = MyResourceClass.ResourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
foreach (DictionaryEntry entry in resourceSet)
{
string resourceKey = entry.Key.ToString();
object resource = entry.Value;
}
それについてのブログ 私のブログで :)短いバージョンは、リソースのフルネームを見つけるためです(あなたがそれらを既に知っていない限り):
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
クラスの他の静的メソッドを使用して、異なるAssemblyオブジェクトを取得します。それが役に立てば幸い :)
ResXResourceReader Class を使用します
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();
リンクを参照してください: Microsoftの例
リソース.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ファイルが現在のアセンブリまたはプロジェクトのスコープ内にある場合にのみ使用できることは明らかです。それ以外の場合は、「パルス」で提供される方法を使用してください。
この方法の利点は、必要に応じてローカライズを考慮して、提供された実際のプロパティを呼び出すことです。ただし、通常はリソースのプロパティを呼び出すタイプセーフダイレクトメソッドを使用する必要があるため、かなり冗長です。
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;
}
}
LINQ to SQL を使用:
XDocument
.Load(resxFileName)
.Descendants()
.Where(_ => _.Name == "data")
.Select(_ => $"{ _.Attributes().First(a => a.Name == "name").Value} - {_.Value}");