Во время выполнения добавьте DataContract и DataMember к динамическому классу, созданному с использованием .Net Reflection - PullRequest
3 голосов
/ 04 февраля 2011

Я использовал .Net Reflection.Emit для создания Динамического Класса и его полей.Теперь, когда я использую Общий список этого динамического объекта класса в сервисе WCF с поддержкой Silverlight, он дает мне ошибку на ссылочной стороне.Сервисная ссылка не знает об этом динамически созданном типе.Это то, о чем я могу думать.Я не уверен в этом?Есть ли у кого-нибудь идеи о том, как украсить этот динамически созданный класс DataContract, а его поля - DataMember?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2011

Даже если вы добавите атрибуты DataContract и DataMember к классу, созданному с помощью Reflection.Emit во время выполнения, контракт не может быть включен в метаданные службы и обнаружен клиентом простодобавление этих атрибутов, поскольку создание шага метаданных службы выполняется путем проверки параметров контракта и возвращаемых значений и создания описания службы до того, как служба получит шанс на запуск.

Одним простым вариантом будет использование параметра со слабым типом.в вашей сервисной операции, такой как XElement или Message непосредственно к классу

IE:

void SomeOperation(XElement parameter);
void SomeOtherOperation(Message message);

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

0 голосов
/ 05 февраля 2011

Возможно, вы захотите вызвать PropertyBuilder.SetCustomAttribute с CustomAttributeBuilder на основе пустого конструктора DataMemberAttribute.Нечто подобное для TypeBuilder.

...