Преобразовать строку в имя переменной - PullRequest
8 голосов
/ 04 января 2012

У меня есть файл XML, у меня есть узел, и я читаю все дочерние узлы.Имя childNode соответствует переменной, которую я должен установить со значением этого childNode.

В цикле я бы хотел установить:

  • myvar1 в MyValue1
  • myvar2 to MyValue2

Код C #:

protected string myvar1;
protected string myvar2;

Содержимое XML выглядит следующим образом:

<parameters>
 <myvar1>MyValue1</myvar1>
 <myvar2>MyValue2</myvar2>
</parameters>

C # набор переменных:

    foreach (var item in xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes)
    {
        ??????
    }

Есть идеи?

Спасибо,

ОБНОВЛЕНИЕ 1: значение "field" в цикле постоянно равно нулю.

public class ParametersTest
{
    public string myvar1 { get; set; }
    public string myvar2 {get; set;}
}

var type = typeof(ParametersTest);
foreach (XmlNode item in xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes)
{

    var field = type.GetField(item.LocalName);
    field.SetValue(field, item.InnerText);
}

Ответы [ 5 ]

7 голосов
/ 04 января 2012

Вы можете сделать это, используя Отражение :

var type = typeof(SomeClass);
var field = type.GetField(item.Name);
field.SetValue(null, item.InnerText);

RE: ОБНОВЛЕНИЕ 1

var parameters = new ParametersTest();
var type = parameters.GetType();

var s = @"<parameters>
            <MyVar1>MyValue1</MyVar1>
            <MyVar2>MyValue2</MyVar2>
           </parameters>";

var xmlParamInstallation = new XmlDocument();
xmlParamInstallation.LoadXml(s);

foreach (XmlNode item in xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes)
{

    var field = type.GetProperty(item.LocalName);
    field.SetValue(parameters, item.InnerText, null);
}
5 голосов
/ 04 января 2012

Если вы хотите назначить переменные на основе имен узлов в XML, у вас есть по крайней мере пара вариантов:

  • Десериализация структуры XML в объект с соответствующими именами элементов
  • Заполните переменные с помощью отражения
  • Заполните переменные, используя динамические вызовы методов / деревья выражений, которые знают, как читать содержимое узла XML в свойство объекта.

Все эти подходы предлагают более объектно-ориентированный подход к проблеме, чем просто заполнение нескольких переменных, но было бы легко создать легковесную структуру с соответствующими членами, которая заполняется чтением документа XML.

Вы также можете использовать коллекцию на основе ключей (например, Dictionary<string, string>) для хранения значений, если вы просто хотите построить простую коллекцию имен / значений из исходного XML.

3 голосов
/ 04 января 2012

Если вы поместите имена и значения в словарь, вы можете легко получить значения по имени:

Dictionary<string, string> parameters =
  xmlParamInstallation.SelectNodes("parameters")[0].ChildNodes
  .ToDictionary(n => n.Name, n => n.InnerText);

myvar1 = parameters["myvar1"];
myvar2 = parameters["myvar2"];
2 голосов
/ 04 января 2012

Вы можете либо сделать так, как сказал «По умолчанию», либо заглянуть в Reflection.Используя метод Type.GetMember(string), вы можете найти члена с заданным именем (имя тега в вашем XML) и установить его значение.

РЕДАКТИРОВАТЬ
Сэмич победил меня, так чтоЯ дам ему +1 - у него также есть пример кода.

1 голос
/ 04 января 2012

Вы можете проверить XmlSerializer класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...