如何在运行时决定传递哪种类型作为通用参数?

时间:2010-09-02 13:29:14

标签: c# generics serialization dynamic

我有几个消息队列,它们上面有特定的消息。 我使用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 :(得分: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);