创建列表<> .RESX文件中键和字符串的子集

时间:2010-12-02 21:52:58

标签: c#

我有一个.resx文件,其中包含我网站的所有字符串。我想创建List<string>这些字符串的子集,而不必对每个新字符串使用add(),如下所示:

List<string> listOfResourceStrings= new List<string>();
listOfResourceStrings.Add(Resources.WebSite_String1);
listOfResourceStrings.Add(Resources.WebSite_String2);
listOfResourceStrings.Add(Resources.WebSite_String3);
listOfResourceStrings.Add(Resources.WebSite_String4);
listOfResourceStrings.Add(Resources.WebSite_String5);
listOfResourceStrings.Add(Resources.WebSite_Stringn);

我可以用......

System.Resources.ResourceSet listOfResourceStrings = Resources.ResourceManager.GetResourceSet(System.Threading.Thread.CurrentThread.CurrentCulture, true, true);

...但这会返回ResourceSet并包含所有字符串。并且,似乎没有一种简单的方法来查找字符串的子集。

感谢您的帮助,

亚伦

1 个答案:

答案 0 :(得分:0)

资源数据存储在静态属性中,因此可以使用反射根据属性名称选择性地提取属性值。

using System;
using System.Collections.Generic;
using System.Reflection;
using System.Text.RegularExpressions;

namespace ConsoleApplication9
{
  public class Program
  {
    public static void Main(String[] args)
    {
      var strings = GetStringPropertyValuesFromType(typeof(Properties.Resources), @"^website_.*");
      foreach (var s in strings)
        Console.WriteLine(s);
    }

    public static List<String> GetStringPropertyValuesFromType(Type type, String propertyNameMask)
    {
      var result = new List<String>();
      var propertyInfos = type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static);
      var regex = new Regex(propertyNameMask, RegexOptions.IgnoreCase | RegexOptions.Singleline);

      foreach (var propertyInfo in propertyInfos)
      {
        if (propertyInfo.CanRead &&
           (propertyInfo.PropertyType == typeof(String)) &&
           regex.IsMatch(propertyInfo.Name))
        {
          result.Add(propertyInfo.GetValue(type, null).ToString());
        }
      }

      return result;
    }
  }
}