gpt4 book ai didi

c# - 无法在 C# 中使用反射转换列表

转载 作者:数据小太阳 更新时间:2023-10-29 02:01:20 27 4
gpt4 key购买 nike

目前,我在使用 C# 中的反射时遇到了很多麻烦。我正在编写的应用程序允许用户使用配置文件修改某些对象的属性。我希望能够将对象模型(用户项目)保存为 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, "");
}
}

如果对象属性只是字符串,那么应该将它们写成 XML 中的字符串属性。如果一个对象属性是列表,那么它应该递归调用“ReflectToXML”并将其自身作为参数传递,从而创建我需要的嵌套结构,它可以很好地反射(reflect)内存中的对象模型。

我的问题是线路

List<object> listObjects = (aInfo.GetValue(anObject,null) as List<object>);

强制转换不起作用,它只返回 null。在调试时我将行更改为

object temp = aInfo.GetValue(anObject,null);

在其上设置断点以查看“GetValue”返回的内容。它返回一个“对象的通用列表”当然我应该能够施放它吗?烦人的是 temp 变成了对象的通用列表,但是因为我将 temp 声明为单个对象,所以我无法遍历它,因为它没有枚举器。

当我只将对象列表作为类的 propertyInfo 时,如何循环遍历对象列表?

我知道此时我只会保存一个空字符串列表,但这没关系。我很高兴看到结构暂时保存下来。

提前致谢

最佳答案

我假设实际值不是 List<object>但有点像 List<string>List<int>或其他一些不完全的类型 object

如果是这样,那么转换失败的原因是泛型类既不是协变的也不是逆变的。

然而,在 C# 4.0 中,您将能够制作 foreach通过转换为 IEnumerable<object> 来循环工作因为接口(interface)可以是协变/逆变的。

(更多)这里有更多信息:http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx


编辑:

仔细想想,这里不需要泛型方差。 List<T>实现非泛型 IEnumerable .这就是 foreach 所需的全部内容循环操作,只需要object类型的元素即可所以只需将其转换为 IEnumerable而不是 List<object>一切都应该工作正常。

关于c# - 无法在 C# 中使用反射转换列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2608960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com