本文研究用反射字段信息的方式实现和XmlSerializer序列化器同样的一种效果:内存中的对象-》xml文件的名称和值。
public static void GetAllFieldInfosINClass(string upath, object obj)
{
//获取程序中的xml配置结构
Type type = obj.GetType();
List<object> datalist = new List<object>();
List<string> namelist = new List<string>();
var bydatalist = new ArrayList();
var bynamelist = new ArrayList();
List<int> len = new List<int>();
int lenindex = -1;
int chdindex = 0;
foreach (FieldInfo info in type.GetFields())
{
foreach (Attribute node in info.GetCustomAttributes(true))
{
//特性类型为XmlElementAttribute,对应的是没有子节点的第一层节点
if (node.GetType().ToString() == "System.Xml.Serialization.XmlElementAttribute")
{
XmlElementAttribute enode = (XmlElementAttribute)node;
//某名称的节点内的数据值是数组,分类讨论,获得节点名称和数据
if (info.GetValue(obj) is Array)
{
if (info.GetValue(obj).GetType().ToString() == "System.String[]")//某名称的节点内的数据值是字符串数组时,获得节点名称和数据
{
string[] data = (string[])info.GetValue(obj);
for (int i = 0; i < data.Length; i++)
{
namelist.Add(enode.ElementName);
datalist.Add(data[i]);
}
}
else if (info.GetValue(obj).GetType().ToString() == "System.Int32[]")//某名称的节点内的数据值是整型数组,获得节点名称和数据
{
int[] data = (int[])info.GetValue(obj);
for (int i = 0; i < data.Length; i++)
{
namelist.Add(enode.ElementName);
datalist.Add(data[i]);
}
}
else if (info.GetValue(obj).GetType().ToString() == "System.Boolean[]")//某名称的节点内的数据值是整型数组,获得节点名称和数据
{
bool[] data = (bool[])info.GetValue(obj);
for (int i = 0; i < data.Length; i++)
{
namelist.Add(enode.ElementName);
datalist.Add(data[i].ToString().ToLower());
}
}
else //某名称的节点内的数据值既不是整型也不是字符串型的数组,获得节点名称和数据
{
namelist.Add(enode.ElementName);
string reminder = "该节点无子节点,且节点的数据类型为" + info.GetValue(obj).GetType().ToString() + ",请手动添加" + enode.ElementName + "节点!";
datalist.Add(reminder);
}
}
//某名称的节点内的数据值是任意类型的变量,获得节点名称和数据
else
{
namelist.Add(enode.ElementName);
var innertext = info.GetValue(obj);
if (innertext.GetType().ToString() == "System.Boolean")//因为info.GetValue(obj)得到的值如果是布尔型,值会是True或者False。这里想得到的值是true或者false.
{
datalist.Add(innertext.ToString().ToLower());
}
else
{
datalist.Add(innertext);
}
}
}
//特性类型为XmlArrayAttribute,对应的是有子节点的第一层节点
else if (node.GetType().ToString() == "System.Xml.Serialization.XmlArrayAttribute")
{
XmlArrayAttribute anode = (XmlArrayAttribute)node;
if (info.GetValue(obj).ToString() == "System.String[]")
{
string[] data = (string[])info.GetValue(obj);
namelist.Add(anode.ElementName);
datalist.Add(data);
len.Add(data.Length);
for (int i = 0; i < data.Length; i++)
{
bynamelist.Add("string");
bydatalist.Add(data[i]);
}
}
else if (info.GetValue(obj).ToString() == "System.Int32[]")
{
int[] data = (int[])info.GetValue(obj);
namelist.Add(anode.ElementName);
datalist.Add(data);
len.Add(data.Length);
for (int i = 0; i < data.Length; i++)
{
bynamelist.Add("int");
bydatalist.Add(data[i]);
}
}
else if (info.GetValue(obj).ToString() == "System.Boolean[]")
{
bool[] data = (bool[])info.GetValue(obj);
namelist.Add(anode.ElementName);
datalist.Add(data);
len.Add(data.Length);
for (int i = 0; i < data.Length; i++)
{
bynamelist.Add("bool");
bydatalist.Add(data[i].ToString().ToLower());
}
}
else
{
;//若为其他类型的数组,需要将该类型数组的类型、数据和长度分别添加到 bynamelist、bydatalist和len中。
}
}
//特性类型既不是XmlElementAttribute也不是XmlArrayAttribute,跳过不操作,进入下一个循环
else
{
continue;
}
}
}