Использование типа, полученного из CloudQueueMessage

Возможный дубликат:
Передача объектных сообщений в Azure Хранилище очередей

Я работаю над вариантом использования, который требует, чтобы мои сообщения очереди имели несколько больше свойств, чем те, которые предоставляются сообщениями очереди Windows Azure (класс CloudQueueMessage). Я не могу использовать большинство свойств в CloudQueueMessage, так как они в основном защищены.

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

public class AzureQueueMessage : CloudQueueMessage
{
      public AzureQueueMessage(string content): base(content)
      {
      }

      //My new property
      public string Label { get; set; }
}

Остальная часть моего кода вставки и извлечения сообщения выглядит следующим образом:

AzureQueueMessage message = new AzureQueueMessage("testing");
cloudQueue.AddMessage(message);
CloudQueueMessage qmessage = cloudQueue.GetMessage();
AzureQueueMessage azureMessage = qmessage as AzureQueueMessage;

Здесь cloudQueue — мой экземпляр Azure Queue.

Сообщение вставляется нормально, но azureMessage всегда имеет значение null при приведении к моему производному классу.

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

Это нормальное поведение или я что-то упускаю?


person Vinod    schedule 25.07.2012    source источник
comment
Я упомянул эту тему в своем первоначальном вопросе. Я просто хотел избежать десериализации при получении каждого сообщения. Но я думаю, что нет способа добиться этого без десериализации. Спасибо за ваш ответ.   -  person Vinod    schedule 25.07.2012
comment
Как вы думаете, вы могли бы отправлять и возражать по сети без сериализации/десериализации? Это единственный жизнеспособный способ.   -  person astaykov    schedule 25.07.2012


Ответы (2)


Это основные принципы ООП. Когда вы используете приведение as AzureQueueMessage, вы на самом деле говорите: «Попробуйте проверить, действительно ли этот экземпляр является AzureQueueMessage». Но GetMessage() не возвращает AzureQueueMessage, он возвращает CloudQueueMessage, и вы никак не можете это изменить.

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

person user1527329    schedule 25.07.2012

То, что вы хотите, вполне достижимо, но немного по-другому. Это известно как «строго типизированные очереди». Ознакомьтесь с этим SO-вопросом, так как он полностью ответит на ваш вопрос.

person astaykov    schedule 25.07.2012