Как решить во время выполнения, какой тип передать в качестве универсального параметра? - PullRequest
4 голосов
/ 02 сентября 2010

У меня есть несколько очередей сообщений, в которых есть определенные сообщения. Я создал классы для этих сообщений, используя xsd.exe. Я могу получить сообщение синхронно и десериазлизировать его следующим способом:

public oneOfMyTypes DeserializeMessage(XDocument message)
{
 var serializer = new XmlSerializer(typeof(oneOfMyTypes));
 var entity = (oneOfMyTypes)serializer.Deserialize(message.CreateReader());
 return entity;
}

Затем я сохраняю сущность через Fluent NHibernate.

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

Итак, у меня есть список имен очередей в моем app.config, который я использую для создания очередей сообщений при запуске, а затем я хочу подключить один метод к событию .ReceiveCompleted всех очередей:

void queue_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
 var queue = (MessageQueue)sender;
 var message = queue.EndReceive(e.AsyncResult);
 var body = message.Body.ToString();
 var xml = XDocument.Parse(body);
 var queueName = queue.QueueName;
 Type entityType = GetTypeFromQueueName(queueName);
 entityType entity = DeserializeMessage<entityType>(xml);

 var repository = new LogRepository();
 repository.AddEntity<entityType>(entity);
}

private T DeserializeMessage<T>(XDocument message)
{
 var serializer = new XmlSerializer(typeof(T));
 var entity = (T)serializer.Deserialize(message.CreateReader());
 return entity;
}

public Type GetTypeFromQueueName(string queueName)
{
 switch (queueName)
 {
  case "some-message-queue-name":
   return typeof (oneOfMyTypes);
 }
}

Но когда я пытаюсь передать entityType универсальным методам, я получаю "Тип или имя пространства имен ожидаемое". Я, вероятно, делаю что-то действительно глупое, но я не могу понять, как это должно работать.

Я пытался использовать динамическое ключевое слово, а также .MakeGenericType, но безуспешно. Я также посмотрел на:

Но я все еще не получаю ... помощь?

Ответы [ 2 ]

0 голосов
/ 02 сентября 2010

К сожалению, дженерики не предназначены для такого динамического функционирования.Общие параметры должны быть определены во время design .Прошло много времени с тех пор, как я использовал NHibernate, но нет ли способа вставить сущности с синтаксисом вроде:

repository.AddEntity(entity, typeof(myEntityType));

EDIT:

 Session.SaveOrUpdate(object);
0 голосов
/ 02 сентября 2010

Эта ссылка должна помочь вам

http://todotnet.com/post/2006/11/13/Instantiating-Generic-Types-at-runtime.aspx

Вы сможете перейти по ссылке, которую я разместил, чтобы вызвать метод через отражение.

См. Следующеессылка:

http://www.victorchen.info/call-static-method-with-a-string-name/

Таким образом, в основном, когда вы создали свой универсальный тип, вы затем захватываете MethodInfo вашего статического метода и затем вызываете метод Invoke для объекта MethodInfo.

(я на самом деле не пробовал это, но теоретически я считаю, что это должно работать)

...