2013-04-02 2 views
8

Как абстрактный абстрактный класс System.ServiceModel.ClientBase реализует интерфейс IDisposable, если объявление метода Dispose() не отображается/объявляется?ClientBase не реализует IDisposable member

Если я пытаюсь сделать то же самое я получаю сообщение об ошибке и не может скомпилировать

abstract class ATeste : IDisposable 
{ 
} 

'ATeste' не реализует член интерфейса 'System.IDisposable.Dispose()'

I» m, используя VS 2010 и Framework 4.0.

Проверка декларации ClientBase:

// Summary: 
//  Provides the base implementation used to create Windows Communication Foundation 
//  (WCF) client objects that can call services. 
// 
// Type parameters: 
// TChannel: 
//  The channel to be used to connect to the service. 
public abstract class ClientBase<TChannel> : ICommunicationObject, IDisposable where TChannel : class 
{ 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class using the default target endpoint from the application configuration 
    //  file. 
    // 
    // Exceptions: 
    // System.InvalidOperationException: 
    //  Either there is no default endpoint information in the configuration file, 
    //  more than one endpoint in the file, or no configuration file. 
    protected ClientBase(); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class using the callbackInstance as the callback object in a duplex conversation. 
    // 
    // Parameters: 
    // callbackInstance: 
    //  The callback object that the client application uses to listen for messages 
    //  from the connected service. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The callback instance is null. 
    // 
    // System.InvalidOperationException: 
    //  Either there is no default endpoint information in the configuration file, 
    //  more than one endpoint in the file, or no configuration file. 
    protected ClientBase(InstanceContext callbackInstance); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class using the configuration information specified in the application configuration 
    //  file by endpointConfigurationName. 
    // 
    // Parameters: 
    // endpointConfigurationName: 
    //  The name of the endpoint in the application configuration file. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The specified endpoint information is null. 
    // 
    // System.InvalidOperationException: 
    //  The endpoint cannot be found or the endpoint contract is not valid. 
    protected ClientBase(string endpointConfigurationName); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class using the specified binding and target address. 
    // 
    // Parameters: 
    // binding: 
    //  The binding with which to make calls to the service. 
    // 
    // remoteAddress: 
    //  The address of the service endpoint. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The binding is null. 
    // 
    // System.ArgumentNullException: 
    //  The remote address is null. 
    protected ClientBase(Binding binding, EndpointAddress remoteAddress); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class using the specified callback service and endpoint configuration information. 
    // 
    // Parameters: 
    // callbackInstance: 
    //  The callback object that the client uses to listen for messages from the 
    //  connected service. 
    // 
    // endpointConfigurationName: 
    //  The name of the endpoint in the application configuration file. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The callback instance is null. 
    // 
    // System.ArgumentNullException: 
    //  The endpoint is null. 
    // 
    // System.InvalidOperationException: 
    //  The endpoint cannot be found or the endpoint contract is not valid. 
    protected ClientBase(InstanceContext callbackInstance, string endpointConfigurationName); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class using the specified target address and endpoint information. 
    // 
    // Parameters: 
    // endpointConfigurationName: 
    //  The name of the endpoint in the application configuration file. 
    // 
    // remoteAddress: 
    //  The address of the service. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The endpoint is null. 
    // 
    // System.ArgumentNullException: 
    //  The remote address is null. 
    // 
    // System.InvalidOperationException: 
    //  The endpoint cannot be found or the endpoint contract is not valid. 
    protected ClientBase(string endpointConfigurationName, EndpointAddress remoteAddress); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class. 
    // 
    // Parameters: 
    // endpointConfigurationName: 
    //  The name of the endpoint in the application configuration file. 
    // 
    // remoteAddress: 
    //  The address of the service. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The endpoint is null. 
    // 
    // System.ArgumentNullException: 
    //  The remote address is null. 
    // 
    // System.InvalidOperationException: 
    //  The endpoint cannot be found or the endpoint contract is not valid. 
    protected ClientBase(string endpointConfigurationName, string remoteAddress); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class. 
    // 
    // Parameters: 
    // callbackInstance: 
    //  The callback service. 
    // 
    // binding: 
    //  The binding with which to call the service. 
    // 
    // remoteAddress: 
    //  The address of the service endpoint. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The callback instance is null. 
    // 
    // System.ArgumentNullException: 
    //  The binding is null. 
    // 
    // System.ArgumentNullException: 
    //  The remote address is null. 
    protected ClientBase(InstanceContext callbackInstance, Binding binding, EndpointAddress remoteAddress); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class. 
    // 
    // Parameters: 
    // callbackInstance: 
    //  The callback object that the client uses to listen for messages from the 
    //  connected service. 
    // 
    // endpointConfigurationName: 
    //  The name of the endpoint in the application configuration file. 
    // 
    // remoteAddress: 
    //  The address of the service. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The callback instance is null. 
    // 
    // System.ArgumentNullException: 
    //  The endpoint is null. 
    // 
    // System.ArgumentNullException: 
    //  The remote address is null. 
    // 
    // System.InvalidOperationException: 
    //  The endpoint cannot be found or the endpoint contract is not valid. 
    protected ClientBase(InstanceContext callbackInstance, string endpointConfigurationName, EndpointAddress remoteAddress); 
    // 
    // Summary: 
    //  Initializes a new instance of the System.ServiceModel.ClientBase<TChannel> 
    //  class. 
    // 
    // Parameters: 
    // callbackInstance: 
    //  The callback object that the client uses to listen for messages from the 
    //  connected service. 
    // 
    // endpointConfigurationName: 
    //  The name of the endpoint in the application configuration file. 
    // 
    // remoteAddress: 
    //  The address of the service. 
    // 
    // Exceptions: 
    // System.ArgumentNullException: 
    //  The callback instance is null. 
    // 
    // System.ArgumentNullException: 
    //  The endpoint is null. 
    // 
    // System.ArgumentNullException: 
    //  The remote address is null. 
    // 
    // System.InvalidOperationException: 
    //  The endpoint cannot be found or the endpoint contract is not valid. 
    protected ClientBase(InstanceContext callbackInstance, string endpointConfigurationName, string remoteAddress); 

    // Summary: 
    //  Gets the inner channel used to communicate with the service. 
    // 
    // Returns: 
    //  An implementation of the target service contract interface passed as the 
    //  type parameter to the constructor. 
    protected TChannel Channel { get; } 
    // 
    // Summary: 
    //  Gets the underlying System.ServiceModel.ChannelFactory<TChannel> object. 
    // 
    // Returns: 
    //  A System.ServiceModel.ChannelFactory<TChannel> object. 
    public ChannelFactory<TChannel> ChannelFactory { get; } 
    // 
    // Summary: 
    //  Gets the client credentials used to call an operation. 
    // 
    // Returns: 
    //  Returns a System.ServiceModel.Description.ClientCredentials that represents 
    //  the proof of identity presented by the client. 
    public ClientCredentials ClientCredentials { get; } 
    // 
    // Summary: 
    //  Gets the target endpoint for the service to which the WCF client can connect. 
    // 
    // Returns: 
    //  The target endpoint. 
    public ServiceEndpoint Endpoint { get; } 
    // 
    // Summary: 
    //  Gets the underlying System.ServiceModel.IClientChannel implementation. 
    // 
    // Returns: 
    //  The client channel for the WCF client object. 
    public IClientChannel InnerChannel { get; } 
    // 
    // Summary: 
    //  Gets the current state of the System.ServiceModel.ClientBase<TChannel> object. 
    // 
    // Returns: 
    //  The value of the System.ServiceModel.CommunicationState of the object. 
    public CommunicationState State { get; } 

    // Summary: 
    //  Causes the System.ServiceModel.ClientBase<TChannel> object to transition 
    //  immediately from its current state into the closed state. 
    public void Abort(); 
    // 
    // Summary: 
    //  Causes the System.ServiceModel.ClientBase<TChannel> object to transition 
    //  from its current state into the closed state. 
    public void Close(); 
    // 
    // Summary: 
    //  Returns a new channel to the service. 
    // 
    // Returns: 
    //  A channel of the type of the service contract. 
    protected virtual TChannel CreateChannel(); 
    // 
    // Summary: 
    //  Instructs the inner channel to display a user interface if one is required 
    //  to initialize the channel prior to using it. 
    public void DisplayInitializationUI(); 
    // 
    // Summary: 
    //  Replicates the behavior of the default keyword in C#. 
    // 
    // Type parameters: 
    // T: 
    // 
    // Returns: 
    //  Returns null if T is a reference type and zero if T is a numeric value type. 
    protected T GetDefaultValueForInitialization<T>(); 
    protected void InvokeAsync(ClientBase<TChannel>.BeginOperationDelegate beginOperationDelegate, object[] inValues, ClientBase<TChannel>.EndOperationDelegate endOperationDelegate, SendOrPostCallback operationCompletedCallback, object userState); 
    // 
    // Summary: 
    //  Causes the System.ServiceModel.ClientBase<TChannel> object to transition 
    //  from the created state into the opened state. 
    public void Open(); 

    // Summary: 
    //  A delegate that is used by System.ServiceModel.ClientBase<TChannel>.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object) 
    //  for calling asynchronous operations on the client. 
    // 
    // Parameters: 
    // inValues: 
    //  The input values to the asynchronous call. 
    // 
    // asyncCallback: 
    //  Reference to the method to be called when the corresponding asynchronous 
    //  operation completes. 
    // 
    // state: 
    //  An System.Object that lets the client distinguish between different asynchronous 
    //  calls. It is made available to the client in the arguments parameter of the 
    //  event completion callback. 
    // 
    // Returns: 
    //  The result of the asynchronous call. 
    protected delegate IAsyncResult BeginOperationDelegate(object[] inValues, AsyncCallback asyncCallback, object state); 

    // Summary: 
    //  A delegate that is invoked by System.ServiceModel.ClientBase<TChannel>.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object) 
    //  on successful completion of the call made by System.ServiceModel.ClientBase<TChannel>.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object) 
    //  to System.ServiceModel.ClientBase<TChannel>.BeginOperationDelegate. 
    // 
    // Parameters: 
    // result: 
    //  The result returned by the call made by System.ServiceModel.ClientBase<TChannel>.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object)to 
    //  System.ServiceModel.ClientBase<TChannel>.BeginOperationDelegate. 
    // 
    // Returns: 
    //  An array of System.Object that contains the results of the call to the asynchronous 
    //  method. The operation may have multiple return values, which are all returned 
    //  in this object array. 
    protected delegate object[] EndOperationDelegate(IAsyncResult result); 

    // Summary: 
    //  Stores the results from an asynchronous call made by the client. 
    protected class InvokeAsyncCompletedEventArgs : AsyncCompletedEventArgs 
    { 
     // Summary: 
     //  Gets the results from an asynchronous call made by the client. 
     // 
     // Returns: 
     //  An array of System.Object that contains the results from an asynchronous 
     //  call made by the client. 
     public object[] Results { get; } 
    } 
} 

Я проверил еще раз, но на этот раз в явной реализации IDisposable. Теперь это имеет смысл

abstract class ATest : IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Test : ATest 
{ 
} 

Теперь я не могу получить доступ к методу Dispose(), когда я создаю экземпляр класса теста:

 Test t = new Test(); 
     t.Dispose(); 
+0

Я не уверен, где код размещен пришел, но в соответствии с [документации] (HTTP: // MSDN. microsoft.com/en-us/library/bb340248.aspx) он явно реализует 'IDisposable.Dispose' –

+0

+1 для кого-то, показывающего, как реализовать' Dispose' явно в своем классе 'ATeste'. –

ответ

8

using explicit interface implementation.

IDisposable виден и может быть использован в качестве

var client = new WCFTestServiceClient(); // assumingWCFTestServiceClient is WCF client proxy that inherits from ClientBase 
(client as IDisposable).Dispose(); 
+0

Я протестировал его прямо сейчас. Вы правы, спасибо. И извините за мой вопрос о нобе. –

3

ClientBase<TChannel> орудий IDisposable с использованием explicit interface implementation.

Реализация для этого просто вызывает близко:

void IDisposable.Dispose() 
{ 
    this.Close(); 
} 
5

В значительной степени все указал, метод интерфейса явно реализован. Исходный код, который вы видите для ClientBase<TChannel>, - from Metadata (см. Metadata as Source в Visual Studio). Обратите внимание на отсутствие реализации для любой функции или ключевое слово partial.

Visual Studio не будет отображаться в явном виде реализованы члены интерфейса from Metadata (см Stack Overflow question 72686320)


Edit:

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

using System; 

abstract class ATest : IDisposable 
{ 
    void IDisposable.Dispose() 
    { 
     throw new NotImplementedException(); 
    } 
} 

class Test : ATest 
{ 
} 

class OtherClass 
{ 
    public static void Main() 
    { 
     Test t = new Test(); 
     ((IDisposable)t).Dispose(); 
    } 
} 

В результате Unhandled Exception: System.NotImplementedException: The requested feature is not implemented.

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