Создать объект C # на основе XML-файла? - PullRequest
4 голосов
/ 21 марта 2012

Это может быть выход из левого поля, сумасшедший, но мне просто нужно спросить, прежде чем я продолжу реализовывать этот огромный набор классов.

По сути, я пишу парсер двоичных сообщений, который декодирует определенный военный формат сообщения в объект. Проблема в том, что существуют буквально сотни различных типов сообщений, и они почти не имеют ничего общего друг с другом. Поэтому я планирую реализовать это, создав сотню различных объектов.

Однако, несмотря на то, что атрибуты сообщения не имеют ничего общего, метод их декодирования довольно прост и соответствует шаблону. Поэтому я планирую написать генератор кода для генерации всех объектов и логики декодирования для каждого типа сообщений.

Что было бы действительно приятно, так это если бы был какой-то способ динамического создания объекта на основе некоторой схемы. Это не обязательно должен быть XML, но с XML довольно легко работать.

Возможно ли это в C #?

Я бы хотел, чтобы интерфейс выглядел примерно так:

var decodedMessage = MessageDecoder.Decode(byteArray);

Где MessageDecoder определяет тип сообщения и возвращает соответствующий объект. Вероятно, он вернет интерфейс, который реализует свойство MessageType или что-то в этом роде.

По сути, мне интересно, есть ли способ иметь один объект с именем Message, который реализует свойство MessageType. И затем, в зависимости от MessageType, объект Message преобразуется в любой тип сообщения, поэтому мне не нужно тратить время на создание всех этих типов сообщений.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

ExpandOobject Где вы можете динамически добавлять поля к объекту.

Хорошая отправная точка здесь.

2 голосов
/ 21 марта 2012

Является ли xsd.exe тем, что вы ищете?Он может взять файл XML или схему и сгенерировать классы c #.Однако одна проблема, с которой вы можете столкнуться, заключается в том, что некоторые форматы военных сообщений ОЧЕНЬ тупые.Вы можете получить очень большие файлы кода.

1 голос
/ 21 марта 2012

Посмотрите на Шаблоны T4 .Они позволяют вам писать код для генерации кода, они интегрированы в IDE, и они действительно очень просты.

РЕДАКТИРОВАТЬ: Нет способа сделать то, что вам нужно с var, потому что varтребует, чтобы правая часть назначения была статически напечатана (во время компиляции).Я полагаю, что вы можете динамически сгенерировать этот оператор, затем скомпилировать и запустить его, но это очень болезненный подход.

Если у вас есть XSD для всех типов сообщений, вы можете использовать xsd.exe как @jleпредлагает.Если нет, то мне интересно следующее:

// Let's assume this works
var decodedMessage = MessageDecoder.Decode(byteArray);
// Now what?  I don't know what properties there are on decodedMessage, so I cant do anything with it.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...