是否可以在不使用任何LINQ查询的情况下递归地构建XML?

时间:2012-12-15 18:50:36

标签: c# xml linq reflection linq-to-xml

  1. 我之前问了一个问题here, 我想知道接受答案的代码是否可以在正常编程中完成而不用 Linq查询,任何一个例子都将非常感激。
    请注意,这是我开始实现它的方式,并且在实现过程中遇到了一些问题。

  2. 我设法通过反射获得私有字段值而不使用属性,是否有问题?我应该总是通过反射中的属性来获取值吗?

  3. 代码:

    public static class Extensions
    {
        public static XElement ToXml<T>(this T obj)
        {
            Type type = typeof(T);
    
            return new XElement("Class",
                        new XElement(type.Name,
                            from pi in type.GetProperties()
                            where !pi.GetIndexParameters().Any()
                            let value = (dynamic)pi.GetValue(obj, null)
                            select pi.PropertyType.IsPrimitive || 
                                   pi.PropertyType == typeof(string) ?
                                    new XElement(pi.Name, value) : 
                                    Extensions.ToXml(value)
                            )
                        );
        }
    }
    

    提前致谢

1 个答案:

答案 0 :(得分:2)

如果您不想使用LINQ:

public static class Extensions
{
    public static void ToXml<T>(this T obj, XmlWriter writer)
    {
        Type type = typeof(T);
        writer.WriteStartElement("Class");
        writer.WriteStartElement(type.Name);

        foreach (PropertyInfo pi in type.GetProperties())
        {
            if (pi.GetIndexParameters().Length > 0)
                continue;

            var value = pi.GetValue(obj, null);            

            if (pi.PropertyType.IsPrimitive ||
                pi.PropertyType == typeof(string))
            {
                writer.WriteElementString(pi.Name, 
                                   (value == null) ? "" : value.ToString());
                continue;
            }

            if (value == null)
                continue;

            Extensions.ToXml((dynamic)value, writer);
        }

        writer.WriteEndElement();
        writer.WriteEndElement();
    }   
}

用法:

StringBuilder sb = new StringBuilder();
using(var writer = XmlWriter.Create(sb))
    worker.ToXml(writer);

string xml = sb.ToString();