2013-08-02 14 views
5

Sto usando una DLL di terze parti API, bloomberg SAPI per coloro che sanno/hanno accesso ad esso.Come può essere nascosto un metodo di smaltimento?

Ecco il mio problema:

[ComVisible(true)] 
public interface IDisposable  
{ //this is from mscorlib 2.0.0.0 - standard System.IDisposable 
    void Dispose(); 
} 

public abstract class AbstractSession : IDisposable {}//method signatures and comments 

public class Session : AbstractSession {} //method signatures and comments (from assembly metadata) 

Tutto quanto sopra è dal F12/Vai al browser definizione/oggetto in VS2010. Ora, quando provo e utilizzando questo codice:

(new Session()).Dispose(); 

Questo non compila ... errore di compilatore standard - nessun metodo/estensione definizione 'Dispose' stato trovato.

Com'è possibile ??? Hanno creato un assemblaggio e modificato esplicitamente i metadati?

Non so se sia giuridicamente possibile nascondere (a esclusione) un metodo pubblico ....

risposta

16

Questo si chiama explicit interface implementation. La classe è scritto così:

class Session : IDisposable { 
    void IDisposable.Dispose() { 
     // whatever 
    } 
} 

è possibile chiamare solo se la variabile è di tipo IDisposable, come:

IDisposable mySession = new Session(); 
mySession.Dispose(); 

O per casting:

((IDisposable)mySession).Dispose(); 

o con un using dichiarazione, che chiama automaticamente Dispose al termine (questo è specifico solo per IDisposable ed è generalmente una procedura ottimale per smaltire un y oggetto che implementa questa interfaccia):

using (var session = new Session()) { } 
+0

Aaarrgggh! simpatico. Non avevo mai usato le implementazioni esplicite, quindi non sapevo che fosse necessario un cast di interfaccia per usarlo. Grazie ! – Vivek

+0

L'implementazione di un'interfaccia esplicita di solito non è necessaria, ma ci sono alcune volte quando è bello, come quando vuoi forzare i tuoi colleghi sviluppatori a codificare tramite interfaccia invece di implementazione. E alcune volte quando è necessario, come quando è necessario implementare due interfacce diverse che hanno una firma membro identica, è necessario implementare due modi diversi. –

+0

Sì. Grazie. Come hai detto, raramente hai bisogno di usare l'esplicito a meno che i nomi dei metodi non siano in conflitto, quindi questa è la prima volta che vedo questo nel codice di produzione. Mi chiedo cosa si è scontrato con DISPOSITO! :) – Vivek

Problemi correlati