У меня сейчас много проблем с Reflection в 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>);
Приведение не работает и просто возвращает ноль.
Во время отладки я изменил строку на
object temp = aInfo.GetValue(anObject,null);
ударил точку останова, чтобы увидеть, что возвращает "GetValue". Он возвращает «Общий список объектов» Конечно, я должен быть в состоянии привести это? Раздражает то, что temp становится общим списком объектов, но поскольку я объявил temp как единственный объект, я не могу пройти через него, потому что у него нет Enumerator.
Как я могу перебрать список объектов, если у меня есть только как свойствоInfo класса?
Я знаю, что на данный момент я буду сохранять только список пустых строк, но это нормально. Я был бы рад видеть спасение структуры на данный момент.
Заранее спасибо