【问题标题】:c# generic methodc# 泛型方法
【发布时间】:2011-02-27 20:56:58
【问题描述】:

我有一个从 msmq 队列接收消息的方法。

我在 msmq 中有 6 个不同的队列,我想要一个可以接收消息的通用方法。这行得通,但我需要为每个队列编写 6 个方法。我想让它更通用。

public List<QueMessage> getMessagesFromObj1Queue()
{
    List<QueMessage> messageList = new List<QueMessage>();

    QueObj1 que = new QueObj1();

    while (que.ReceiveAll().Count > 0)
    {
        varmessage = que.Receive(new TimeSpan(0, 1, 0));
        messageList.Add(message);
    }

    return messageList;
}

我有 5 个不同的对象,它们只是扩展了一个抽象类。下面不起作用。

public List<QueMessage> getMessagesFromObj1Queue<T>(T que)
{
    List<QueMessage> messageList = new List<QueMessage>();

    while (que.ReceiveAll().Count > 0)
    {
        varmessage = que.Receive(new TimeSpan(0, 1, 0));
        messageList.Add(message);
    }

    return messageList;
}

上面没有用

如何解决这个问题?

【问题讨论】:

  • 如果您发布您收到的实际错误消息,而不是仅仅说“不起作用”,您更有可能得到答案。 什么不起作用?

标签: c# .net generics message-queue


【解决方案1】:

如果您的示例中的 T 是所有队列对象都继承的某个基类,那么您可以将其传递给方法而不是 T

public List<QueMessage> getMessagesFromObj1Queue<T>(QueueObjBase que) { ... }

否则,如果有所有T 都将实现的通用接口,则将其用作通用约束:

public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
   where T : [yourInterface]
{
}

如果没有对T 的通用约束,编译器没有任何信息可以知道哪些方法或属性可用,因此只能将T 视为object - 当然,这不会有一个RecieveAll() 方法。

【讨论】:

  • 我没有接口,只有一个抽象类。
  • 如果是这种情况,那么只需将该抽象类型直接传递给方法。我假设ReceiveAll() 已经返回了QueMessage 的实例。
【解决方案2】:

这里的问题是您没有告诉 C# 编译器关于 que 的类型,因此它必须将其视为对象。您必须提供更多信息,以便它可以正确绑定 Receive 方法。

这可以通过向方法添加通用约束来完成。例如

public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
  where T : [InsertBaseTypeOfQues]

【讨论】:

    【解决方案3】:

    在方法上添加 where 约束,并将类型参数声明为您的基类。

    其中 T : 类型参数必须是或派生自指定的基类。

    查看来自 msdn 的 generic type constrains

    【讨论】:

      【解决方案4】:

      事实上,类型 T 没有 ReceiveAll 方法。您需要添加一个约束,以便编译器知道该方法存在,对于 T 的任何实例化。所以,您会得到:

      public List getMessagesFromObj1Queue(T que) : where T : XXX

      不过,我对 MSMQ 的了解还不够,无法知道 XXX 应该是什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多