我目前在C#中使用反射遇到了很多麻烦。我正在编写的应用程序允许用户使用配置文件修改某些对象的属性。我希望能够将对象模型(用户项目)保存为XML。以下函数在foreach循环的中间被调用,循环遍历包含项目中所有其他对象的对象列表。想法是通过递归地将对象模型转换为XML。
如果对象的属性只是字符串,则应将其作为字符串属性写入XML中。如果对象的属性是列表,则应递归调用“ReflectToXML”,将自身作为参数传递,从而创建我所需的嵌套结构,以很好地反映内存中的对象模型。
我的问题出在这行代码上。
不要担心对“Unreal”的调用,只需在对象名称中包含特定单词时轻微修改对象名称即可。
private void ReflectToXML(object anObject, XmlElement parentElement)
{
Type aType = anObject.GetType();
XmlElement anXmlElement = m_xml.CreateElement(Unreal(aType.Name));
parentElement.AppendChild(anXmlElement);
PropertyInfo[] pinfos = aType.GetProperties();
//loop through this objects public attributes
foreach (PropertyInfo aInfo in pinfos)
{
//if the attribute is a list
Type propertyType = aInfo.PropertyType;
if ((propertyType.IsGenericType)&&(propertyType.GetGenericTypeDefinition() == typeof(List<>)))
{
List<object> listObjects = (aInfo.GetValue(anObject,null) as List<object>);
foreach (object aListObject in listObjects)
{
ReflectToXML(aListObject, anXmlElement);
}
}
//attribute is not a list
else
anXmlElement.SetAttribute(aInfo.Name, "");
}
}
如果对象的属性只是字符串,则应将其作为字符串属性写入XML中。如果对象的属性是列表,则应递归调用“ReflectToXML”,将自身作为参数传递,从而创建我所需的嵌套结构,以很好地反映内存中的对象模型。
我的问题出在这行代码上。
List<object> listObjects = (aInfo.GetValue(anObject,null) as List<object>);
这个代码片段可能存在问题,因为它返回了空值(null)。 在调试过程中,我修改了这一行:
object temp = aInfo.GetValue(anObject,null);
我在它上面设置了一个断点,以查看“GetValue”返回的内容。它返回一个“对象的通用列表”。 我肯定应该能够强制转换吧?让人恼火的是,temp变成了一个对象的通用列表,但由于我将temp声明为单个对象,所以无法循环遍历它,因为它没有枚举器。
当我只有它作为类的propertyInfo时,如何循环遍历对象列表?
我知道此时我只会保存一组空字符串,但没关系。现在我很高兴看到结构体被保存下来。
谢谢提前