2013-05-08 4 views
6

У меня есть класс с этим полем:Почему метод Dispose() недоступен для моего объекта IDisposable?

private WcfChannelFactory<IPrestoService> _channelFactory; 

В методе Dispose(), я делаю это:

if (_channelFactory != null) { _channelFactory.Dispose(); } 

Но выдает ошибку:

Cannot access explicit implementation of IDisposable.Dispose

После выполнения около research, представляется, что я могу распоряжаться таким образом:

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); } 

Я не понимаю две вещи:

  1. Почему не Dispose() доступны? WcfChannelFactory<T> происходит от ChannelFactory<T>, который происходит от ChannelFactory, который реализует IDisposable. Тем не менее, ChannelFactory не имеет метода Dispose(). Как это возможно?

  2. Если бы я мог (должен?) Просто позвонить Close() на _channelFactory, почему не документация XML состояние, Close() также называют Dispose()? Может, это не так? Это смущает.

ответ

7
  1. Поскольку метод Dispose реализован explicilty для интерфейса IDisposable, вы можете видеть только метод, когда у вас есть ссылка типа IDisposable. Метод есть, но вы не можете видеть его, когда у вас есть ссылка другого типа. Это похоже на то, как частный метод доступен только из кода внутри самого класса, хотя он всегда присутствует.

  2. Метод Close не называет Dispose для этого класса. Метод не закрывает завод, он запускает процесс асинхронного закрытия. Когда метод Close завершает работу, процесс закрытия не завершен, поэтому объект не может быть удален в это время.

+0

Так как я должен распоряжаться '_channelFactory'? Должен ли я называть 'Close()'? Должен ли я называть 'Dispose()'? –

+0

@Bob, nevermind. Не обращай внимания на свой первоначальный вопрос. Похоже, вы реализуете свой собственный одноразовый шаблон. –

+0

@ AnthonyPegram Я не могу. Метод возвращает '_channelFactory'. Потребитель обертывает вызов в 'using', поэтому моему классу необходимо реализовать« IDiposable »и« dipose ». –

2

Метод Dispose был реализован в качестве явного члена интерфейса IDisposable. То есть, определение выглядит следующим образом:

public class WcfChannelFactory<T> : IDisposable 
{ 
    public void IDisposable.Dispose() 
    { 
     ... 
    } 
} 

Учебник: Explicit Interface Implementation Tutorial

+0

Я знаю, какая явная реализация интерфейса. Благодаря! –

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