繁体   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