C# 使用反射将XML数组反序列化到列表中

C# 使用反射将XML数组反序列化到列表中,c#,reflection,xml-deserialization,propertyinfo,C#,Reflection,Xml Deserialization,Propertyinfo,我想将XML文档反序列化为对象,这是我的对象定义: public class Student { public string FirstName { get; set; } public string LastName { get; set; } public List<string> Hobbies { get; set; } } 但是上面的函数不再起作用了(XML输入已经更改,现在它有一个名为嗜好的数组) 以下行引发异常: prop.SetValue(s

我想将XML文档反序列化为对象,这是我的对象定义:

public class Student
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public List<string> Hobbies { get; set; }
}
但是上面的函数不再起作用了(XML输入已经更改,现在它有一个名为嗜好的数组)

以下行引发异常:

prop.SetValue(student, child.InnerText); // child.InnerText = ReadingSingingTennis
这是因为业余爱好的
child.InnerText
返回
readingtennis
,代码尝试将
列表设置为单个
字符串


如何修改此函数以正确设置嗜好?

问题在于嗜好中有节点

所以你可以这样试试

 public static void DeserializeNode(XmlNode node)
    {
        var student = new Student();

        foreach (XmlNode child in node)
        {
            PropertyInfo prop = student.GetType().GetProperty(child.Name);
            if (child.Attributes.GetNamedItem("type").Value == "list")
            {
                var list = Activator.CreateInstance(prop.PropertyType);
                foreach (XmlNode item in child)
                {
                    var methodInfo = list.GetType().GetMethod("Add");
                    methodInfo.Invoke(list, new object[] { item.InnerText });
                }

                prop.SetValue(student, list);
            }
            else
            {
                prop.SetValue(student, child.InnerText);
            }
        }
    }

但是如果您有更复杂的xml,您应该使用递归和反射

它会引发什么样的异常?异常的消息是什么?
prop.SetValue(student, child.InnerText); // child.InnerText = ReadingSingingTennis
 public static void DeserializeNode(XmlNode node)
    {
        var student = new Student();

        foreach (XmlNode child in node)
        {
            PropertyInfo prop = student.GetType().GetProperty(child.Name);
            if (child.Attributes.GetNamedItem("type").Value == "list")
            {
                var list = Activator.CreateInstance(prop.PropertyType);
                foreach (XmlNode item in child)
                {
                    var methodInfo = list.GetType().GetMethod("Add");
                    methodInfo.Invoke(list, new object[] { item.InnerText });
                }

                prop.SetValue(student, list);
            }
            else
            {
                prop.SetValue(student, child.InnerText);
            }
        }
    }