【发布时间】:2013-06-20 03:28:23
【问题描述】:
目前我在使用 C# 中的反射时遇到了很多麻烦。我正在编写的应用程序允许用户使用配置文件修改某些对象的属性。我希望能够将对象模型(用户项目)保存为 XML。下面的函数在 foreach 循环的中间被调用,循环遍历包含项目中所有其他对象的对象列表。这个想法是,它递归地工作以将对象模型转换为 XML。
不用担心调用“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 声明为单个对象,所以我不能循环遍历它,因为它没有 Enumerator。
当我只将对象列表作为类的 propertyInfo 时,如何循环访问它?
我知道此时我只会保存一个空字符串列表,但没关系。我很高兴看到结构暂时保存下来。
提前致谢
【问题讨论】:
标签: c# .net xml reflection