Создать объект C # на основе файла xml?

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

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

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

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

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

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

var decodedMessage = MessageDecoder.Decode(byteArray);

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

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


person ConditionRacer    schedule 20.03.2012    source источник
comment
возможный дубликат Создавать свойства программно   -  person nawfal    schedule 20.07.2014


Ответы (3)


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

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

person Sandeep    schedule 20.03.2012

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

person jle    schedule 20.03.2012
comment
Это выглядит неплохо, если я действительно пойду по пути генерации кода. Но мне бы очень хотелось каким-то образом избавиться от необходимости определять каждый объект до его фактического декодирования. Звучит странно, просто сказать это, но я должен был спросить, прежде чем потратить на это все время. - person ConditionRacer; 21.03.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.
person Chris Shain    schedule 20.03.2012