我有几个消息队列,它们上面有特定的消息。 我使用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,但没有运气。 我也看了看:
但我仍然没有得到它......帮助?
答案 0 :(得分:0)
此链接可以帮助您
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,然后在MethodInfo对象上调用Invoke方法。
(我实际上没有尝试过这个,但理论上我相信它应该有用)
答案 1 :(得分:0)
不幸的是,泛型并不意味着像这样动态地运行。通用参数必须在 design 时定义。自从我使用NHibernate以来已经有一段时间了,但是没有办法插入具有如下语法的实体:
repository.AddEntity(entity, typeof(myEntityType));
修改强>
或
Session.SaveOrUpdate(object);