[英]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.