C# 使用反射将值从XML加载到结构中
我使用反射将一些值从XML加载到结构中。一切正常,但我在管理阵列时遇到了问题。使用Int32是可以的,但是如何管理Int32[] 编辑:这是我的代码。。。由于长度原因,它不完整。。。我想改进数组类型的保存和加载C# 使用反射将值从XML加载到结构中,c#,arrays,xml,reflection,C#,Arrays,Xml,Reflection,我使用反射将一些值从XML加载到结构中。一切正常,但我在管理阵列时遇到了问题。使用Int32是可以的,但是如何管理Int32[] 编辑:这是我的代码。。。由于长度原因,它不完整。。。我想改进数组类型的保存和加载 //My struct ... it should be a class too public struct stOptions { public int IntNumber; public double DoubleNu
//My struct ... it should be a class too
public struct stOptions
{
public int IntNumber;
public double DoubleNumber;
public string String;
public Point aPoint;
}
//How my class works
private void Form1_Load(object sender, EventArgs e)
{
stOptions options = new stOptions();
//Populate the struct
options.aPoint = new Point(12, 24);
options.DoubleNumber = 34d;
options.IntNumber = 17;
options.String = "Hello";
ManageSettings ms = new ManageSettings();
ms.SaveSettings("e:\\test001.xml", options);
options = default(stOptions);
options = ms.LoadSettings<stOptions>("e:\\test001.xml");
}
//A portion of my class
public T LoadSettings<T>(string FileName)
{
Type type = typeof(T);
var returnObject = Activator.CreateInstance(type);
List<Settings> list = null;
try
{
using (StreamReader reader = File.OpenText(FileName))
{
XmlSerializer serializer = new XmlSerializer(typeof(List<Settings>));
list = (List<Settings>)serializer.Deserialize(reader);
}
}
catch
{
//Error accessing the file
_errors.Add("Unable to locate the file or access denied: " + FileName);
return default(T);
}
try
{
foreach (Settings entry in list)
{
FieldInfo field = returnObject.GetType().GetField(entry.Key.ToString());
if (field != null)
{
SetField(field, entry.Value.ToString(), returnObject);
}
field = null;
PropertyInfo prop = returnObject.GetType().GetProperty(entry.Key.ToString());
if (prop != null)
{
SetField(prop, entry.Value.ToString(), returnObject);
}
prop = null;
}
list = null;
}
catch
{
//Error processing the XML
_errors.Add("Errore processing the XML file: " + FileName);
return default(T);
}
return (T)returnObject;
}
private void SetField(FieldInfo prop, string value, object returnObject)
{
switch (prop.FieldType.Name.ToLower())
{
case "uint16":
prop.SetValue(returnObject, Convert.ToUInt16(value));
break;
case "uint32":
prop.SetValue(returnObject, Convert.ToUInt32(value));
break;
etc.
[...]
default:
//An unmanaged type
Debug.WriteLine("Found an unmanaged type: " + prop.FieldType.Name);
break;
}
}
//我的结构。。。它也应该是一门课
公共结构停止
{
公共整数;
公众双倍号码;
公共字符串;
公共点;
}
//我的班级是如何运作的
私有void Form1\u加载(对象发送方、事件参数e)
{
停止选项=新停止();
//填充结构
options.aPoint=新点(12,24);
options.DoubleNumber=34d;
options.IntNumber=17;
options.String=“Hello”;
ManageSettings ms=新的ManageSettings();
ms.SaveSettings(“e:\\test001.xml”,选项);
选项=默认值(停止);
选项=ms.LoadSettings(“e:\\test001.xml”);
}
//我班的一部分
公共T加载设置(字符串文件名)
{
类型=类型(T);
var returnObject=Activator.CreateInstance(类型);
List=null;
尝试
{
使用(StreamReader=File.OpenText(文件名))
{
XmlSerializer serializer=新的XmlSerializer(typeof(List));
list=(list)序列化程序。反序列化(reader);
}
}
抓住
{
//访问文件时出错
_错误。添加(“无法找到文件或访问被拒绝:+FileName”);
返回默认值(T);
}
尝试
{
foreach(列表中的设置条目)
{
FieldInfo field=returnObject.GetType().GetField(entry.Key.ToString());
如果(字段!=null)
{
SetField(字段,entry.Value.ToString(),returnObject);
}
字段=空;
PropertyInfo prop=returnObject.GetType().GetProperty(entry.Key.ToString());
如果(prop!=null)
{
设置字段(prop,entry.Value.ToString(),returnObject);
}
prop=null;
}
列表=空;
}
抓住
{
//处理XML时出错
_添加(“处理XML文件时出错:“+FileName”);
返回默认值(T);
}
return(T)returnObject;
}
私有void设置字段(FieldInfo属性、字符串值、对象返回对象)
{
开关(prop.FieldType.Name.ToLower())
{
案例“uint16”:
prop.SetValue(returnObject,Convert.ToUInt16(value));
打破
案例“uint32”:
prop.SetValue(returnObject,Convert.ToUInt32(value));
打破
等
[...]
违约:
//非托管类型
WriteLine(“找到非托管类型:”+prop.FieldType.Name);
打破
}
}
完成后,我将发布它。为什么不阅读xml文件并自动将其转换为C#类?就像在这里看到的:布鲁诺,你的解决方案很好,90%的效果。当我尝试序列化字体时,它失败了,因为它没有没有没有参数的构造函数。当我试图序列化一个颜色变量时,XML文件中没有写入任何值。您好,您能提供一个您正在做的代码示例吗?也许用更新的代码编辑您的文章?我的目标是创建一个简单的结构或类,其中包含一些公共字段和/或公共属性,然后保存并重新加载它。我将从传递给函数的对象(结构或类)创建一个列表,然后将其序列化。然后我将使用反射重新加载所有数据。我可以发送我所有的代码,但有很多行代码。。。我可以吗?我是新用户。。。很抱歉,感谢您的耐心。您不需要使用反射来从XML检索值,下面我将为您提供一个完整的工作代码示例。我希望它能为您提供一个好的方向。您为什么不阅读xml文件并自动将其转换为C#类呢?就像在这里看到的:布鲁诺,你的解决方案很好,90%的效果。当我尝试序列化字体时,它失败了,因为它没有没有没有参数的构造函数。当我试图序列化一个颜色变量时,XML文件中没有写入任何值。您好,您能提供一个您正在做的代码示例吗?也许用更新的代码编辑您的文章?我的目标是创建一个简单的结构或类,其中包含一些公共字段和/或公共属性,然后保存并重新加载它。我将从传递给函数的对象(结构或类)创建一个列表,然后将其序列化。然后我将使用反射重新加载所有数据。我可以发送我所有的代码,但有很多行代码。。。我可以吗?我是新用户。。。很抱歉,感谢您的耐心。您不需要使用反射来从XML检索值,下面我将为您提供一个完整的工作代码示例。我希望它能给你一个好的方向。