DrL*_*zer 4 .net c# xml reflection
我目前在C#中使用Reflection有很多麻烦.我正在编写的应用程序允许用户使用配置文件修改某些对象的属性.我希望能够将对象模型(用户项目)保存到XML.下面的函数在foreach循环的中间调用,循环遍历包含项目中所有其他对象的对象列表.这个想法是,它以递归方式将对象模型转换为XML.
不要担心调用"虚幻",只要它们包含某些单词,就会略微修改对象的名称.
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, "");
}
}
Run Code Online (Sandbox Code Playgroud)
如果对象属性只是字符串,那么应该将它们作为XML中的字符串属性写出来.如果一个对象属性是列表,那么它应该递归地调用"ReflectToXML"作为参数传递自己,从而创建我需要的嵌套结构,它很好地反映了内存中的对象模型.
我遇到的问题是线路
List<object> listObjects = (aInfo.GetValue(anObject,null) as List<object>);
Run Code Online (Sandbox Code Playgroud)
强制转换不起作用,只返回null.在调试时我将线路更改为
object temp = aInfo.GetValue(anObject,null);
Run Code Online (Sandbox Code Playgroud)
在它上面打了一个断点,看看"GetValue"正在返回什么.它返回一个"通用的对象列表"当然我应该能够投射它?令人讨厌的是temp变成了一个通用的对象列表,但是因为我将temp声明为一个单个对象,所以我无法遍历它,因为它没有Enumerator.
当我只将它作为类的propertyInfo时,我如何遍历对象列表?
我知道在这一点上我只会保存一个空字符串列表,但那很好.我很高兴看到结构现在省去了.
提前致谢
我假设的实际值是不是一个List<object>,而是像一个List<string>或List<int>或一些其他类型的,是不是正好 object?
如果是这样,那么演员表失败的原因是因为泛型类既不是共同的也不是逆变的.
但是,在C#4.0中,您可以foreach通过强制转换来使循环工作,IEnumerable<object>因为接口可以是共同/逆变的.
(更多)更多信息:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx
编辑:
考虑一下,这里不需要通用差异.List<T>实现非泛型IEnumerable.这就是foreach循环操作所需的全部,你只需要元素作为类型,object所以只需将它转换为一个IEnumerable而不是List<object>一切都应该正常工作.
| 归档时间: |
|
| 查看次数: |
2847 次 |
| 最近记录: |