2013-08-02 6 views
5

Używam biblioteki DLL innej firmy, bloomberg SAPI dla tych, którzy znają/mają do niego dostęp.Jak ukryć metodę utylizacji?

Oto mój 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) 

Wszystkie powyższe jest z F12/Idź do przeglądarki definicja/obiektu w VS2010. Teraz, gdy próbuję i użyć tego kodu:

(new Session()).Dispose(); 

To nie skompilować ... błąd standardowy kompilator - brak definicji metoda/rozszerzenie „wyrzucić” można znaleźć.

Jak to jest możliwe ??? Zrobili montaż i jawnie edytowali jego metadane?

Nie wiem, czy jest to prawnie możliwe, aby ukryć (wykluczenie) metodę publiczną ....

Odpowiedz

16

To się nazywa explicit interface implementation. Klasa jest napisane tak:

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

można tylko nazwać, jeśli zmienna jest typu IDisposable, jak:

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

Albo przez odlewanie:

((IDisposable)mySession).Dispose(); 

lub z using instrukcja, która automatycznie wywołuje Dispose po jej zakończeniu (jest to specyficzne tylko dla IDisposable, i jest ogólnie najlepszą praktyką do unieszkodliwienia obiekt y implementujący ten interfejs):

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

Aaarrgggh! miły. Nigdy nie używałam jawnych implementacji, więc nie wiedziałam, że potrzebujesz interfejsu do obsłużenia go. Dzięki ! – Vivek

+0

Jawna implementacja interfejsu zwykle nie jest konieczna, ale czasami są one miłe, np. Gdy chcesz zmusić innych programistów do kodowania za pomocą interfejsu zamiast implementacji. Czasem, gdy jest to konieczne, np. Gdy trzeba zaimplementować dwa różne interfejsy, które mają identyczny podpis członka, który należy wprowadzić na dwa różne sposoby. –

+0

Yup. Dzięki. Jak wspomniałeś, rzadko musisz używać jawności, chyba że nazwy metod są sprzeczne, więc po raz pierwszy zobaczyłem to w kodzie produkcyjnym. Ciekawe, co zderzyło się z DISPOSE! :) – Vivek