c # универсальный метод - PullRequest
4 голосов
/ 04 июня 2010

У меня есть метод, который получает сообщения из очереди msmq.

У меня есть 6 разных очередей в msmq, и я хотел бы использовать один общий метод, который будет принимать сообщения Это работает, но мне нужно написать 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;
}

выше не работает

как это исправить?

Ответы [ 4 ]

5 голосов
/ 04 июня 2010

Если T в вашем примере является некоторым базовым классом, который наследуют все объекты очереди, , тогда вы можете просто передать это методу вместо T:

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

В противном случае, если есть общий интерфейс, который будут реализованы всеми T, используйте его как общее ограничение:

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

Без общего ограничения на T, компилятор не имеет никакой информации, чтобы знать, какой метод или свойства доступны, и поэтому может обрабатывать только T как object - что, конечно, не есть метод RecieveAll().

3 голосов
/ 04 июня 2010

Проблема в том, что вы ничего не сказали компилятору C # о типе que и, следовательно, он должен рассматривать его как объект.Вы должны предоставить больше информации, чтобы он мог правильно связать метод Receive.

Это можно сделать, добавив общее ограничение к методу.Например

public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
  where T : [InsertBaseTypeOfQues]
1 голос
/ 04 июня 2010

Как таковой, тип T не имеет метода ReceiveAll. Вам нужно добавить ограничение, чтобы компилятор знал, что метод существует, для любого экземпляра T. Итак, вы получите:

публичный список getMessagesFromObj1Queue (T que): где T: XXX

Я не знаю MSMQ достаточно, чтобы знать, каким должен быть XXX.

1 голос
/ 04 июня 2010

Добавьте метод where в метод и исключите параметр типа, который будет вашим базовым классом.

где Т: Аргумент типа должен быть или наследоваться от указанного базового класса.

см. ограничения общего типа из msdn

...