将字符串转换为变量名称

时间:2012-01-04 08:28:04

标签: c# xml reflection deserialization

我有一个XML文件,我有一个节点,我读了所有ChildNodes。 childNode的名称与我必须使用此childNode的值设置的变量匹配。

在循环中,我想设置:

  • myvar1 to 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”始终为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 个答案:

答案 0 :(得分:7)

您可以使用Reflection执行此操作:

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

答案 1 :(得分:5)

如果您要根据XML中的节点名称分配变量,则至少有两个选项:

  • 将XML结构反序列化为具有相应成员名称的对象
  • 使用反射填充变量
  • 使用动态方法调用/表达式树填充变量,这些树知道如何将XML节点的内容读入对象属性。

所有这些方法都提出了一种更加面向对象的方法,然后只填充一些变量,但是使用适当的成员创建一个轻量级结构很容易,这些成员通过读取XML文档来填充。

如果您只是想从源XML构建一个简单的名称/值集合,您还可以使用基于键的集合(如Dictionary<string, string>)来存储值。

答案 2 :(得分:3)

如果将名称和值放在字典中,则可以通过名称轻松获取值:

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

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

答案 3 :(得分:2)

你可以做“默认”说,或者你可以看看反思。通过使用Type.GetMember(string)方法,您可以找到具有给定名称的成员(XML中的标记名称)并设置其值。

修改
Samich打败了我,所以我会给他+1 - 他也有示例代码。

答案 4 :(得分:1)

您可以查看XmlSerializer课程