Как я могу вернуть экземпляр динамически построенного типа службе WCF, ожидающей интерфейс? - PullRequest
1 голос
/ 01 апреля 2009

Я хочу получить контракт на операцию, который возвращает интерфейс.

Мои проблемы:

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

2) Я хочу на стороне клиента, чтобы иметь возможность построить динамический реализатор интерфейса из сообщения.

Я не хочу связываться с сообщениями. Я просто хочу, чтобы детали реализации были скрыты.

Ответы [ 2 ]

1 голос
/ 01 апреля 2009

Я столкнулся с той же ситуацией: я думаю, что у вас есть , чтобы по своей природе использовать атрибут [KnownType], чтобы сериализатор знал, какую реализацию ждать.

Ключевым моментом является то, что сериализатор получает несколько байтов с небольшими метаданными относительно того, как их читать (в основном, имя типа). Вот почему необходимо знать, какой тип эти байты должны представлять, и «знать» этот тип. Без этой информации у сериализатора нет абсолютно никакой возможности выяснить, где он должен найти несколько полей, реализующих функциональность вашего интерфейса.

Однако вы можете добавить новые KnownTypes во время выполнения (т.е. динамически), используя непосредственно DataContractSerializer

Много информации по этой теме здесь

0 голосов
/ 01 апреля 2009

Вы можете реализовать метод, который возвращает известные типы для DataContract, используя специальную перегрузку KnownTypeAttribute и предоставив ему имя метода, который возвращает известные типы в виде массива. Метод может возвращать типы, которые известны только во время выполнения:

[DataContract]
[KnownType("GetKnownTypes")]
public class MyDataContract
{
   public int X { get; set; }

   public static Type[] GetKnownTypes()
   {
      return new Type[] { typeof(Class1), typeof(Class2) }; 
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...