无法在C#中使用Reflection强制转换列表

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时,我如何遍历对象列表?

我知道在这一点上我只会保存一个空字符串列表,但那很好.我很高兴看到结构现在省去了.

提前致谢

Gre*_*ech 5

我假设的实际值是不是一个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>一切都应该正常工作.