Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

c# generic method

I have a method that receives messages from a queue of msmq.

I have 6 different queues in msmq and i d like a single generic method that would receive the messages. THis work, but i need to write 6 methods for each queue. I d like to make it more generic.

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

I have 5 different object which just extends a single abstract class. Below doenst work.

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

Above doesnt work

how to fix this?

like image 278
DarthVader Avatar asked Dec 17 '25 18:12

DarthVader


1 Answers

If T in your example is some base class that all queue objects inherit, then you can just pass that to the method instead of T:

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

Otherwise, if there's come common interface that all T's will implement, use that as a generic constraint:

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

Without a generic constraint on T, the compiler doesn't have any information to know what method or properties are available, and so can only treat T as object - which, of course, doesn't have a RecieveAll() method.

like image 123
LBushkin Avatar answered Dec 20 '25 06:12

LBushkin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!