Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#一般方法_C#_.net_Generics_Message Queue - Fatal编程技术网

c#一般方法

c#一般方法,c#,.net,generics,message-queue,C#,.net,Generics,Message Queue,我有一个从msmq队列接收消息的方法 我在msmq中有6个不同的队列,我想要一个接收消息的通用方法。这是可行的,但我需要为每个队列编写6个方法。我想让它更通用 public List<QueMessage> getMessagesFromObj1Queue() { List<QueMessage> messageList = new List<QueMessage>(); QueObj1 que = new QueObj1(); w

我有一个从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;
}
public List getMessagesFromObj1Queue()
{
List messageList=新列表();
QueObj1 que=新QueObj1();
而(que.ReceiveAll().Count>0)
{
varmessage=que.Receive(新的时间跨度(0,1,0));
messageList.Add(消息);
}
返回消息列表;
}
我有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;
}
public List getMessagesFromObj1Queue(tque)
{
List messageList=新列表();
而(que.ReceiveAll().Count>0)
{
varmessage=que.Receive(新的时间跨度(0,1,0));
messageList.Add(消息);
}
返回消息列表;
}
上述方法不起作用


如何修复此问题?

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

这可以通过向方法添加泛型约束来实现。比如说

public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
  where T : [InsertBaseTypeOfQues]
public List getMessagesFromObj1Queue(tque)
其中T:[插入BaseTypeofQues]

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

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

如果对
T
没有通用约束,编译器没有任何信息来知道可用的方法或属性,因此只能将
T
视为
object
——当然,它没有
receiveAll()
method.

在方法上添加一个where约束,并将type参数作为基类

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


从msdn中可以看出,类型T没有ReceiveAll方法。对于T的任何实例化,您需要添加一个约束,以便编译器知道该方法存在。因此,您将得到:

公共列表getMessagesFromObj1Queue(tQue):其中T:XXX


不过,我对MSMQ的了解还不足以让我知道XXX应该是什么。

如果你发布收到的实际错误消息,而不是仅仅说“不起作用”,你就更有可能得到答案。什么不起作用?我没有接口,只有一个抽象类。如果是这样,那么直接将抽象类型传递给方法。我假设
ReceiveAll()
已经返回了
QueMessage
的实例。
public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
   where T : [yourInterface]
{
}