代码之家  ›  专栏  ›  技术社区  ›  autonomatt

如何在运行时决定作为泛型参数传递哪个类型?

  •  4
  • autonomatt  · 技术社区  · 16 年前

    我已经使用xsd.exe文件. 我可以同步接收消息并使用以下方法对其进行反序列化:

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

    然后我通过Fluent NHibernate将实体持久化。

    我想保持这个小处理器应用程序的可维护性,这样添加更多的消息队列和消息类型就不会成为一件痛苦的事情。

    所以我有一个队列名称列表在我的应用程序配置用于在启动时创建消息队列,然后将单个方法连接到所有队列的.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传递给泛型方法时,得到的结果是“需要类型或命名空间名称”。 我可能在做一些非常愚蠢的事情,但我不知道该怎么做。

    我试过使用dynamic关键字和.MakeGenericType,但没有成功。 我也看过:

    2 回复  |  直到 9 年前
        1
  •  0
  •   Steve Danner    16 年前

    设计 时间。我已经有一段时间没有使用NHibernate了,但是有没有一种方法可以用如下语法插入实体:

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

    编辑:

     Session.SaveOrUpdate(object);
    
        2
  •  0
  •   F.B. ten Kate    16 年前

    这个链接应该对你有帮助

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

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

    (实际上我还没有试过这个,但理论上我认为它应该会起作用)

    推荐文章