Получение набора значений из файла ресурсов в C # - PullRequest
0 голосов
/ 01 февраля 2012

Я храню набор значений в файле ресурсов (resx), и их имена расположены в пространстве так:

Form.Option.Value1 | Car 
Form.Option.Value2 | Lorry
Form.Option.Value3 | Bus
Form.Option.Value4 | Train

Если есть способ с классом System.Resources.ResourceManager, чтобы получить все эти значения за один раз. Я ищу своего рода метод префикса:

ResourceManager manager ...
IEnumerable<string> values = manager.GetStringsByPrefix("Form.Option");

Причина для этого заключается в том, что у нас есть форма с выпадающим списком, где значения могут потребоваться изменить в зависимости от культуры.

Также возможно возвращать строковые значения в виде пар ключ-значение, чтобы я мог получить имя ресурса и его значение, например ::10000

IEnumerable<KeyValuePair<string,string>> values = manager.GetPairWithPrefix("Form.Options")

Ответы [ 5 ]

2 голосов
/ 01 февраля 2012

Вы можете перечислить все строки для определенного языка в ResourceManager, используя метод GetResourceSet .

1 голос
/ 01 февраля 2012

Спасибо за ответ, я решил эту проблему, подклассифицировав ResourceManager и добавив новый метод:

public class ResourceManager : System.Resources.ResourceManager
{
    public ResourceManager(Type resourceSource)
        : base(resourceSource)
    {

    }

    public IEnumerable<string> GetStringsByPrefix(string prefix)
    {
        return GetStringsByPrefix(prefix, null);
    }

    public IEnumerable<string> GetStringsByPrefix(string prefix, CultureInfo culture)
    {
        if (prefix == null)
            throw new ArgumentNullException("prefix");
        if (culture == null)
            culture = CultureInfo.CurrentUICulture;
        var resourceSet = this.InternalGetResourceSet(culture, true, true);

        IDictionaryEnumerator enumerator = resourceSet.GetEnumerator();
        List<string> results = new List<string>();

        while (enumerator.MoveNext())
        {
            string key = (string)enumerator.Key;


            if (key.StartsWith(prefix))
            {
                results.Add((string)enumerator.Value);
            }
        }
        return results;
    }
} 
1 голос
/ 01 февраля 2012

Возможно, вам следует пересмотреть формат.Нравится

 Form.Option.Value = Car;Lorry;Bus;...
1 голос
/ 01 февраля 2012

Если вы используете функцию локализации, встроенную в Visual Studio / .NET Framework, для локализации ваших форм (включая списки со списком), он генерирует код, подобный следующему:

Найдено в Form1.de.resx:

<data name="comboBox1.Items" xml:space="preserve">
  <value>Auto</value>
</data>
<data name="comboBox1.Items1" xml:space="preserve">
  <value>Bahn</value>
</data>

Найдено в Form1.resx:

<data name="comboBox1.Items" xml:space="preserve">
  <value>Car</value>
</data>
<data name="comboBox1.Items1" xml:space="preserve">
  <value>Train</value>
</data>

И загружает их вот так (находится в Form1.Designer.cs в Initializecomponent):

System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Form1));

resources.ApplyResources(this.comboBox1, "comboBox1");
this.comboBox1.FormattingEnabled = true;
this.comboBox1.Items.AddRange(new object[] {
   resources.GetString("comboBox1.Items"),
   resources.GetString("comboBox1.Items1")});
this.comboBox1.Name = "comboBox1";

Возможно, это не совсем тот ответ, который вы просили, но, поскольку разработчики .NET решили ту же самую проблему, я подозреваю, что она будет интересна.

Если вы хотите использовать собственную локализацию .NET / VS, просто установите свойство Language формы, а затем обновите все строки через IDE. Когда вы вернетесь к (По умолчанию) ваши исходные строки будут восстановлены. Оба языка будут запомнены в языковых файлах resx.

0 голосов
/ 01 февраля 2012

Хотя среда IDE для редактирования файлов resx не поддерживает его, вы можете добавить строковые массивы (и я подозреваю, что любой сериализуемый класс) в файл resx:

string outPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
outPath = System.IO.Path.Combine(outPath, "MyResources.resx");
using (System.Resources.ResXResourceWriter rw = new System.Resources.ResXResourceWriter(outPath))
{
   rw.AddResource("ComboBox1Values", new string[] { "Car", "Train" });
   rw.Generate();
   rw.Close();
}

В выходном файле вы увидите что-то вроде:

<data name="ComboBox1Values" mimetype="application/x-microsoft.net.object.binary.base64">
  <value>AAEAAAD/////AQAAAAAAAAARAQAAAAIAAAAGAgAAAANDYXIGAwAAAAVUcmFpbgs=</value>
</data>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...