我在C#中反射时遇到了很多麻烦。我正在编写的应用程序允许用户使用配置文件修改某些对象的属性。我希望能够将对象模型(用户项目)保存为XML。下面的函数在foreach循环的中间被调用,循环遍历包含项目中所有其他对象的对象列表。这个想法是,它递归地将对象模型转换成XML。无法在C中使用反射投射列表#
不要担心“虚幻”的调用,如果它们包含某些单词,它们会略微修改对象的名称。
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时,如何循环访问对象列表?
我知道在这一点上,我只会保存空串的列表,但那很好。我很乐意看到结构现在保存。
在此先感谢
谢谢你,让我想到了解决问题的其他方法。我将列表切换到ArrayLists,一切都很好。 – DrLazer 2010-04-12 08:58:32
@DrLazer - 说实话,你甚至不应该需要那个;因为'List <>'和'ArrayList'都实现了'IList',所以与'IList'接口谈话并且它不关心具体列表是什么。 – 2010-04-12 09:22:16
噢!这完全是一笔交易。谢谢您的帮助 – DrLazer 2010-04-12 09:54:08