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 に答える