Как сформировать структуру по xml-файлу, используя System.Reflection и/или ILGenerator на C#?
У меня имеется n-ое количество xml-файлов с данным для бд разной, но единой в рамках файла, структуры. Возникла необходимость одним универсальным(?) методом распаковать любой xml-файл в List<...> структур или экземпляров класса. Проблема в том, что, по-хорошему, нужно для каждого файла писат собственный класс/структуру, в массив экземпляров которого он будет распаковываться. Но файлов достаточно много и писать самому для каждого структуру это не самый удобный по времени вариант.
Появился вариант сгенерировать структуру в ходе выполнения программы через System.Reflection или System.Reflection.Emit.ILGenerator, но я решительно не понимаю, как это нормально использовать, и вообще в том ли направлении я ищу решение.
По логике, сигнатура метода должна выглядеть как-то так:
public static DeserializedXml XmlUnbox(string path) { ...}
где DeserializedXml это структура:
struct DeserializedXml
{
Type typeInfo; // информация о сгенерированном типе
List<object> xmlElements; // список считанных объектов типа typeInfo
}
Пример структуры xml-файла:
<xml>
<CreditCard>
<CardIssuer>MasterCard</CardIssuer>
<CardNumber>1111 2222 3333 4444</CardNumber>
<CardExpDate>2020\01</CardExpDate>
<Balance>1000</Balance>
<CardHolder>IVAN IVANOV</CardHolder>
</CreditCard>
</xml>
И фрагмент метода который я пытался написать:
class DataUnbox
{
struct DeserializedXml
{
Type typeInfo; // информация о сгенерированном типе
List<object> xmlElements; // список считанных объектов типа typeInfo
}
public static DeserializedXml XmlUnbox(string file)
{
string name; // имя структуры
List<string> fields = new List<string>(); // поля структуры
XmlDocument xDoc = new XmlDocument();
xDoc.Load(file);
XmlElement xRoot = xDoc.DocumentElement;
XmlNode structNode = xRoot.FirstChild;
name = structNode.Name; // получение имени структуры по названию тега xml
foreach (XmlNode cNode in structNode.ChildNodes) fields.Add(cNode.Name); // получение имён полей структуры из дочерних элементов
}
}