2009-12-10 15 views
10

Esiste un modo per mantenere la stessa funzionalità nel codice riportato di seguito, ma senza dover creare il delegato? Sto interagendo con un'API di terze parti che contiene vari metodi DeleteSomethingX (ref IntPtr ptr) e sto cercando di centralizzare il codice per il controllo IntPtr.Zero.delegato con parametro ref

private void delegate CleanupDelegate(ref IntPtr ptr); 

... 

private void Cleanup(ref IntPtr ptr, CleanupDelegate cleanup) 
{ 
    if (ptr != IntPtr.Zero) 
    { 
     cleanup(ref ptr); 
    } 
} 
+2

Che cosa si sta tentando di fare esattamente? –

+1

Cosa c'è di sbagliato nella creazione del delegato? – SLaks

+0

Sei sicuro che l'API di terze parti non gestisca un puntatore nullo come un NOP? –

risposta

10

Se si intende senza dichiarare il tipo di delegato, probabilmente no; pochissimi (se esistenti) delegati incorporati usano ref; ma potresti renderlo generico:

delegate void ActionRef<T>(ref T value); 

Non sono sicuro che questo consente di risparmiare molto. Ci può anche essere alcuni trucchi qui con i metodi di estensione, ma è difficile dire senza ulteriori dettagli.

Problemi correlati