XML帮助类 xml 转实体 或 实体 转xml
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using System.Reflection;
using System.Collections;
namespace ClassLibrary1
{
public static class XMLHelper
{
public static void FillEntityWithXml<T>(this T entity, XDocument doc, Assembly assembly, AssemblyLoadType LoadType = AssemblyLoadType.Calling, string AssemblyName = null)
where T : class, new()
{
if (assembly == null)
{
switch (LoadType)
{
case AssemblyLoadType.Calling:
assembly = Assembly.GetCallingAssembly();
break;
case AssemblyLoadType.Executing:
assembly = Assembly.GetExecutingAssembly();
break;
case AssemblyLoadType.Load:
assembly = Assembly.Load(AssemblyName);
break;
}
}
entity = entity ?? new T();
XElement root = doc.Root;
PropertyInfo[] props = entity.GetType().GetProperties();
foreach (PropertyInfo prop in props)
{
var propName = prop.Name;
if (root.Element(propName) != null)
{
string XMLValue = root.Element(propName).Value;
switch (prop.PropertyType.Name)
{
#region 基本属性
case "DateTime":
DateTime dtValue;
if (DateTime.TryParse(XMLValue, out dtValue))
{
prop.SetValue(entity, dtValue, null);
}
break;
case "Boolean":
bool bValue = false;
if (bool.TryParse(XMLValue, out bValue))
{
prop.SetValue(entity, bValue, null);
}
break;
case "Int32":
int iValue = 0;
if (int.TryParse(XMLValue, out iValue))
{
prop.SetValue(entity, iValue, null);
}
break;
case "Int64":
long lValue = 0;
if (long.TryParse(XMLValue, out lValue))
{
prop.SetValue(entity, lValue, null);
}
break;
case "Double":
double dValue = 0;
if (double.TryParse(XMLValue, out dValue))
{
prop.SetValue(entity, dValue, null);
}
break;
case "Single":
float fValue = 0;
if (Single.TryParse(XMLValue, out fValue))
{
prop.SetValue(entity, fValue, null);
}
break;
case "String":
prop.SetValue(entity, XMLValue, null);
break;
#endregion
#region List
case "List`1":
string itemName = prop.PropertyType.GetGenericArguments()[0].FullName;
Type Ttype = assembly.GetType(itemName);
Type listType = typeof(List<>).MakeGenericType(Ttype);
var list = Activator.CreateInstance(listType);
MethodInfo addMethod = listType.GetMethod("Add");
foreach (XElement xe in root.Element(propName).Elements())
{
var itemEntity = assembly.CreateInstance(itemName);
FillEntityWithXml(itemEntity, new XDocument(xe), assembly);
addMethod.Invoke((object)list, new object[] { itemEntity });
}
prop.SetValue(entity, list, null);
break;
#endregion
#region 类或枚举
default:
if (prop.PropertyType.IsEnum)
{
Type eType = assembly.GetType(prop.PropertyType.FullName);
prop.SetValue(entity, Enum.Parse(eType, XMLValue), null);
}
else
{
var cEntity = assembly.CreateInstance(prop.PropertyType.FullName);
FillEntityWithXml(cEntity, new XDocument(root.Element(propName)), assembly);
prop.SetValue(entity, cEntity, null);
}
break;
#endregion
}
}
}
}
public static XElement XMLFromEntity<T>(this T entity)
{
Type type = entity.GetType();
XElement doc = new XElement(type.Name);
PropertyInfo[] props = type.GetProperties();
foreach (PropertyInfo prop in props)
{
XElement node = new XElement(prop.Name);
if (!prop.PropertyType.IsGenericType)
{
object nodevalue = prop.GetValue(entity, null);
node.Value = nodevalue == null ?"": nodevalue.ToString();
}
else {
IList lstValue = prop.GetValue(entity, null) as IList;
if (lstValue != null)
{
foreach (var childnode in lstValue)
{
node.Add(XMLFromEntity(childnode));
}
}
}
doc.Add(node);
}
return doc;
}
}
}