我之前问了一个问题here,
我想知道接受答案的代码是否可以在正常编程中完成而不用 Linq
查询,任何一个例子都将非常感激。
请注意,这是我开始实现它的方式,并且在实现过程中遇到了一些问题。
我设法通过反射获得私有字段值而不使用属性,是否有问题?我应该总是通过反射中的属性来获取值吗?
代码:
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)
)
);
}
}
提前致谢
答案 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();