我有几个特定的消息队列,并且在它们上面有特定的消息。我使用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传递给泛型方法时,会出现"Type or namespace name expected"的错误。 我可能做了一些非常愚蠢的事情,但我无法弄清楚这应该如何工作。
我尝试使用dynamic关键字和.MakeGenericType,但没有成功。 我还看了以下内容:
- Dynamic Generic declaration of type T - Function returning a generic type whose value is known only at runtime - Determining a Generic Type at Runtime in Non-Generic Class - How to pass variable of type "Type" to generic parameter 但我仍然不明白...能帮忙吗?
MakeGenericMethod
函数。 - nawfal