C#泛型方法

3
我有一个从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;
}

上述方法不起作用。 如何修复这个问题?

1
如果您发布实际收到的错误消息,而不仅仅是说“不起作用”,那么您更有可能得到答案。 到底是什么出了问题? - Bryan Watts
4个回答

5

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

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

否则,如果所有的T都实现了一个共同的接口,请将其用作通用约束:
public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
   where T : [yourInterface]
{
}

没有对 T 进行泛型约束,编译器就不知道有哪些方法或属性可用,只能将 T 视为 object - 当然,object 没有 RecieveAll() 方法。


我没有接口,只有一个抽象类。 - DarthVader
如果是这种情况,那么直接将该抽象类型传递给方法即可。我假设 ReceiveAll() 已经返回了 QueMessage 实例。 - LBushkin

3
问题在于,您没有告诉C#编译器关于que类型的信息,因此它必须将其视为对象。您需要提供更多信息,以便它可以正确地绑定Receive方法。
可以通过向方法添加泛型约束来解决这个问题。例如:
public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
  where T : [InsertBaseTypeOfQues]

1

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

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

请参阅msdn上的泛型类型约束


1

目前,类型T没有ReceiveAll方法。您需要添加一个约束条件,以便编译器知道该方法对于T的任何实例化都存在。因此,您将获得:

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

我不太了解MSMQ,不知道XXX应该是什么。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接