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?