Сценарий здесь с 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 как свойство, чтобы достичь того, что - Интерфейс не может иметь статические свойства, мне нужно создать фиктивный объект для получения свойств
Так что код здесь выглядит для меня несколько странно,Есть ли лучший способ сделать это?