У меня возникают проблемы с Reflection в C# на данный момент. Приложение, которое я пишу, позволяет пользователю изменять атрибуты определенных объектов с помощью файла конфигурации. Я хочу, чтобы сохранить объектную модель (проект пользователей) в XML. Функция, приведенная ниже, вызывается в середине цикла foreach, перебирая список объектов, которые содержат все остальные объекты в проекте внутри них. Идея заключается в том, что она рекурсивно работает для перевода объектной модели в XML.Невозможно лить списки с отражением в C#
Не беспокойтесь о вызове «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);
хлопнул контрольную точку на ней, чтобы увидеть, что «ПолучитьЗначение» возвращался. Он возвращает «Общий список объектов». Конечно, я должен уметь это делать? Досадно, что temp становится общим списком объектов, но поскольку я объявлял temp как особый объект, я не могу его пропустить, потому что у него нет Enumerator.
Как я могу прокручивать список объектов, когда у меня есть только свойство свойств класса?
Я знаю, что в данный момент я сохраню список пустых строк, но это нормально. Я был бы рад видеть, что структура сохранится на данный момент.
Заранее спасибо
Спасибо, человек, который заставил меня задуматься о других способах решения проблемы. Я переключил списки в ArrayLists, и все хорошо. – DrLazer
@DrLazer - Если честно, вам даже не нужно было этого; поскольку 'List <>' и 'ArrayList' реализуют' IList', разговаривают с интерфейсом 'IList', и это не имеет значения, каков конкретный список. –
О, хорошо! Теперь все готово. Спасибо за помощь – DrLazer