2013-08-02 8 views
5

Ich benutze eine API API dll, Bloomberg SAPI von Drittanbietern für diejenigen, die darauf zugreifen können.Wie kann eine Entsorgungsmethode verborgen werden?

Hier ist mein Problem:

[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) 

Alle der oben genannten ist von der F12/Gehe zu Definition/Objekt-Browser in VS2010. Nun, wenn ich versuche, und verwenden Sie diesen Code:

(new Session()).Dispose(); 

Dies gilt nicht kompilieren ... Standard-Compiler-Fehler - keine Definition/Extension-Methode ‚Entsorgen‘ gefunden werden.

Wie ist das möglich ??? Sie haben eine Assembly erstellt und ihre Metadaten explizit bearbeitet?

Ich weiß nicht, ob es rechtlich möglich ist (Ausschluss) eine öffentliche Methode zu verstecken ....

Antwort

16

Diese explicit interface implementation genannt wird.

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

Sie können es nur nennen, wenn Ihre Variable vom Typ ist IDisposable, wie: Die Klasse ist wie geschrieben

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

oder durch Gießen:

((IDisposable)mySession).Dispose(); 

oder mit einem using Anweisung, die automatisch Dispose aufruft, wenn sie abgeschlossen ist (dies gilt nur für IDisposable, und ist im Allgemeinen eine bewährte Methode zum Entsorgen eines y Objekt, das diese Schnittstelle implementiert):

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

Aaarrgggh! nett. Ich hatte nie die expliziten Implementierungen verwendet und wusste daher nicht, dass Sie eine Schnittstelle benötigen, um sie zu verwenden. Vielen Dank ! – Vivek

+0

Explizite Schnittstellenimplementierung ist in der Regel nicht notwendig, aber manchmal ist es auch schön, wenn Sie zum Beispiel Ihre Mitentwickler dazu zwingen wollen, nach Schnittstellen statt nach Implementierung zu programmieren. Und manchmal, wenn es notwendig ist, wie wenn Sie zwei verschiedene Schnittstellen implementieren müssen, die eine identische Mitgliedssignatur haben, müssen Sie zwei verschiedene Arten implementieren. –

+0

Yup. Vielen Dank. Wie Sie bereits erwähnt haben, müssen Sie die expliziten Ausdrücke nur selten verwenden, wenn die Methodennamen kollidieren. Dies ist das erste Mal, dass ich dies im Produktionscode sah. Wundern Sie sich, was mit DISPOSE kollidierte! :) – Vivek

Verwandte Themen