簡體   English   中英

c#泛型方法

[英]c# generic method

我有一個從msmq隊列接收消息的方法。

我在msmq中有6個不同的隊列,id就像一個接收消息的通用方法。 這是工作,但我需要為每個隊列編寫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;
}

以上不起作用

怎么解決這個問題?

如果你的例子中的T是所有隊列對象繼承的基類,那么你可以將它傳遞給方法而不是T

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

否則,如果有所有T將實現的通用接口,請將其用作通用約束:

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

如果沒有對T的通用約束,編譯器就沒有任何信息可以知道哪些方法或屬性可用,因此只能將T視為object - 當然,它沒有RecieveAll()方法。

這里的問題是你告訴C#編譯器沒有關於que的類型,因此它必須把它當作一個對象。 您必須提供更多信息,以便它可以正確綁定Receive方法。

這可以通過向方法添加通用約束來完成。 例如

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

在方法上添加一個where contraint,並將類型參數作為基類進行delcare。

其中T:type參數必須是或從指定的基類派生。

從msdn看到泛型類型約束

實際上,類型T沒有ReceiveAll方法。 您需要添加一個約束,以便編譯器知道該方法存在,對於T的任何實例化。因此,您將獲得:

public List getMessagesFromObj1Queue(T que):其中T:XXX

我不知道MSMQ足以知道XXX應該是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM