Общий метод чтения объектов из больших файлов XML в C # - PullRequest
0 голосов
/ 21 марта 2019

Сценарий здесь с XML, но я думаю, что он может быть довольно общим.

Я пытаюсь десериализовать определенные типы объектов из файлов XML.Процедуры одинаковы для этих типов, поэтому я использую универсальные методы.Файлы XML имеют большой размер, поэтому я объединяю XmlReader и XmlSerializer.

Пример получения всех объектов определенного типа:

public static List<T> GetAll<T>() where T : IMyXml, new()
{
    var toReturn = new List<T>();
    T t = new T();
    string fileName;
    // different types are located in different XML files
    if (t.Type == XmlTypeEnum.A) fileName = "A.xml";
    else if (t.Type == XmlTypeEnum.B) fileName = "B.xml";
    else throw ... ;

    using (var stream = GetStreamFromResource(fileName)) //get file from embedded resource
    {
        using (var reader = XmlReader.Create(stream))
        {
            reader.ReadToFollowing(t.ParentName);
            while (reader.ReadToFollowing(t.SelfName))
            {
                var serializer = new XmlSerializer(typeof(T));
                t = (T)serializer.Deserialize(reader.ReadSubtree());
                toReturn.Add(t);
            }
        }
    }
    return toReturn;
}

В то время как все типы реализуютобщий интерфейс

[XmlType]
public interface IMyXml
{
    [XmlIgnore]
    string ParentName { get; }
    [XmlIgnore]
    string SelfName { get; }
    [XmlIgnore]
    XmlTypeEnum Type { get; }
} 

Проблемы здесь:

  • Общие типы не должны if -оедаться (правда, я прав?), я должен добавитьenum как свойство, чтобы достичь того, что
  • Интерфейс не может иметь статические свойства, мне нужно создать фиктивный объект для получения свойств

Так что код здесь выглядит для меня несколько странно,Есть ли лучший способ сделать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...