2013-08-02 2 views
5

Я использую стороннюю API dll, bloomberg SAPI для тех, кто знает/имеет к ней доступ.Как можно скрыть метод удаления?

Вот моя проблема:

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

Все вышеперечисленное от F12/Перейти к определению объекта/браузера в VS2010. Теперь, когда я пытаюсь и использовать этот код:

(new Session()).Dispose(); 

Это не компилируется ... стандартная ошибка компилятора - не определение метода/расширения «не Dispose» может быть найден.

Как это возможно ??? Они сделали сборку и явно отредактировали ее метаданные?

Я не знаю, если это возможно юридически, чтобы скрыть (для исключения) публичный метод ....

ответ

16

Это называется explicit interface implementation. Класс написан как:

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

Вы можете только назвать это, если переменная имеет тип IDisposable, как:

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

Или литьем:

((IDisposable)mySession).Dispose(); 

или с using , который автоматически вызывает Dispose, когда он завершается (это относится только к IDisposable и, как правило, является наилучшей практикой для y, который реализует этот интерфейс):

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

Aaarrgggh! хороший. Я никогда не использовал явные реализации, поэтому не знал, что вам нужен интерфейс, чтобы использовать его. Благодаря ! – Vivek

+0

Явная реализация интерфейса обычно не требуется, но есть моменты, когда это приятно, например, когда вы хотите заставить своих коллег-разработчиков закодировать по интерфейсу вместо реализации. И несколько раз, когда это необходимо, например, когда вам нужно реализовать два разных интерфейса, которые имеют идентичную подпись элемента, которые вам нужно реализовать двумя разными способами. –

+0

Yup. Благодарю. Как вы уже упоминали, вам редко нужно использовать явное, если имена методов не столкнулись, поэтому это первый раз, когда я увидел это в производственном коде. Интересно, что столкнулось с УТИЛИЗАЦИЕЙ! :) – Vivek

Смежные вопросы