0
  1. 我之前问过一个问题,可以在这里找到,我想知道接受的答案的代码是否可以在没有 Linq查询的情况下在正常编程中完成,任何示例都将不胜感激。
    请注意,这是我开始实施它的方式,并且在实施过程中遇到了一些问题。

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

代码:

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

提前致谢

4

1 回答 1

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();
于 2012-12-15T19:17:33.767 回答