Преобразовать строку в имя переменной
у меня есть 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 - у него тоже есть образец кода.