Sto usando Lidgren e per ogni nuovo tipo di messaggio che faccio, finisco per scrivere lo stesso tipo di codice. Sto creando un'istanza di NetOutgoingMessage
, eseguendo varie chiamate di assegnazione su di esso, quindi inviandolo quando ho finito. La creazione e l'invio sono uguali, quindi voglio scrivere un wrapper per farlo, ma è una classe sealed
e non è IDisposable
. Quello che sto facendo è qualcosa di simile:Qualcosa di simile a "using" che creerà un oggetto e richiamerà un metodo al termine, ma fammi fare quello che voglio tra
NetOutgoingMessage om = server.CreateMessage();
om.Write(messageType);
om.Write(data1);
om.Write(data2);
server.SendMessage(om, server.Connections, NetDeliveryMethod.UnreliableSequenced, 0);
E io voglio fare qualcosa di simile:
using(AutoNetOutgoingMessage om(server, messageType, NetDeliveryMethod.UnreliableSequenced))
{
om.Write(data1);
om.Write(data2);
}
Ovviamente non posso fare using
quindi c'è un altro modo comune se implementare la funzionalità in questo modo? Non sto cercando una soluzione incredibilmente complicata, in quanto si tratta solo di manutenibilità per me, quindi non ho problemi a ripetere il mio codice per ogni messaggio. Ma sono curioso di sapere se c'è un trucco divertente del C# di cui non so nulla.
potresti non essere in grado di ereditare la classe, ma puoi eseguire un wrapper su di esso, la cui istanza crea l'istanza della classe desiderata, quindi il wrapper può implementare IDisposable chiamando il metodo della classe reale su dispose –
Ma anche se tu può, non farlo come suggerisce @RoyalBg. Non usare 'using' qui. Non si * vorrebbe * chiamare 'server.SendMessage' se una qualsiasi delle chiamate 'om.Write' restituisce un'eccezione. Il punto di 'using' è che' Dispose() '* sempre * viene chiamato, anche se qualsiasi parte del codice nel blocco fallisce. (Che ora vedo è già stato sottolineato nei commenti sulla risposta di Cyral.) – hvd