[英]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]
實際上,類型T沒有ReceiveAll方法。 您需要添加一個約束,以便編譯器知道該方法存在,對於T的任何實例化。因此,您將獲得:
public List getMessagesFromObj1Queue(T que):其中T:XXX
我不知道MSMQ足以知道XXX應該是什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.