Преобразовать строку в имя переменной

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

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

  • myvar1 в MyValue1
  • myvar2 в 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: значение "поле" в цикле все время равно null.

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 ответов


Вы можете сделать это с помощью отражение:

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);
}

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

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

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

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


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

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

myvar1 = parameters["myvar1"];
myvar2 = parameters["myvar2"];

вы можете сделать так, как сказал" по умолчанию", или вы можете посмотреть в отражение. Используя Type.GetMember(string) метод вы можете найти элемент с заданным именем (имя тега в вашем XML) и установить его значение.

редактировать
Самич победил меня, поэтому я дам ему +1 - у него тоже есть образец кода.


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