2010-06-04 3 views
4

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

У меня есть 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 разных объектов, которые просто расширяют один абстрактный класс. Ниже doenst работы.

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; 
} 

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

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

+0

У вас гораздо больше шансов получить ответ, если вы публикуете фактические сообщения об ошибках, которые вы получаете, вместо того, чтобы просто сказать «не работает». * Что * не работает? –

ответ

5

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

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

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

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

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

+0

У меня нет интерфейса, кроме одного абстрактного класса. – DarthVader

+0

Если это так, то просто передайте этот абстрактный тип прямому методу. Я предполагаю, что 'ReceiveAll()' уже возвращает экземпляры 'QueMessage'. – LBushkin

3

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

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

public List<QueMessage> getMessagesFromObj1Queue<T>(T que) 
    where T : [InsertBaseTypeOfQues] 
1

Добавьте, где будет использоваться метод, и рассмотрите тип param как ваш базовый класс.

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

см generic type constrains из MSDN

1

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

общественности Список getMessagesFromObj1Queue (T дие): где T: XXX

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

Смежные вопросы