Costruzione di oggetti generici - Classi ereditate

0

Fondamentalmente sto scrivendo una libreria di utility di pattern di messaggistica multi-thread basata su MSMQ. È come se un insieme di componenti ereditasse (direttamente o indirettamente) una classe chiamata la mia classe componente di base.

Ciascuno di questi componenti di messaggistica ha la capacità di ascoltare più code tramite più thread e di elaborare i messaggi tramite più thread.

Quindi ho una classe base worker che si esegue da sola su un thread, ma nell'implementazione si eredita questa classe e si riempiono le lacune. Quindi voglio essere in grado di costruire fondamentalmente un oggetto generico che eredita questa classe al volo e quindi metterlo in funzione. Finora ho questo che funziona, ma mi chiedo solo se c'è un modo migliore per farlo là fuori.

Il mio codice corrente ...

public class EzQBaseComponent<TWorker> : IEzQComponent where TWorker : EzQWorker
{
    /// LOTS OF CODE YOU DON'T NEED TO KNOW :"D

    private void Listener_MessageRecieved(Guid listenerID, MessageQueue queue, Message msg, MessageQueueTransaction myTransaction)
    {
        try
        {
        lock (m_MessageRecievedLocker)
        {
            if(myTransaction == null)
            {
                // YAWN
            }
            if(msg.Label == c_CustomComponentMessageCommandLabel)
            {
                // YAWN
            }
            else if(Workers.Count < DelegatedWorkers)
            {
                Type t = typeof(TWorker);
                ConstructorInfo[] conInfos = t.GetConstructors();
                ConstructorInfo correctConstructor = null;
                foreach (ConstructorInfo cInfo in conInfos)
                {
                    if (cInfo.GetParameters().Count() < 1)
                    {
                        correctConstructor = cInfo;
                    }
                }

                if (correctConstructor == null)
                {
                    throw new Exception("Generic TWorker class does not contain a consturctor with '0' arguments. Cannot Construct class.");
                }

                TWorker worker = (TWorker)correctConstructor.Invoke(null);

                // YAWN
            }
            else
            {
                // YAWN
            }
        }
    }
    catch (Exception Ex)
    {
        // NOOOO EXCEPTION!!
    }
}

Fondamentalmente, la mia classe base ha un costruttore senza parametri. Quindi cerco quello senza parametri tramite reflection, e quindi uso quel costruttore.

Qualche idea sulla costruzione dell'oggetto generico? È il modo migliore?

    
posta Ruina 22.04.2014 - 00:49
fonte

1 risposta

2

Sembra che sarebbe più semplice usare la classe Activator ' CreateInstance metodo invece:

T worker = (T)Activator.CreateInstance(typeof(T));

In pratica fa la stessa cosa. CreatInstance usa il costruttore predefinito / senza parametri per il tipo e restituisce un oggetto (quindi il casting). Se uno non esiste, genererà un'eccezione.

Modifica rapida: per il tuo codice di esempio, il blocco sarà più simile a:

else if(Workers.Count < DelegatedWorkers)
{
    try
    {
        TWorker worker = (TWorker)Activator.CreateInstance(typeof(TWorker));
    }
    catch (MissingMethodException ex)
    {
         throw new Exception("Generic TWorker class does not contain a consturctor with '0' arguments. Cannot Construct class.");
    }
}
    
risposta data 24.04.2014 - 16:47
fonte

Leggi altre domande sui tag