2013-04-02 113 views
8

如果Dispose()方法聲明不可見/聲明,那麼System.ServiceModel.ClientBase抽象類如何實現IDisposable接口?ClientBase不實現IDisposable成員

如果我試圖做同樣的我得到一個錯誤,無法編譯

abstract class ATeste : IDisposable 
{ 
} 

「ATeste」不實現接口成員「System.IDisposable.Dispose()」

我使用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爲某人展示如何顯式地在他的'ATeste'類實現'Dispose'。 –

回答

8

using explicit interface implementation

IDisposable是可見的並且可以被調用作爲

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

我現在測試了它。你是對的,謝謝。對於我的noob問題感到抱歉。 –

5

由於幾乎每個人都指出,該接口方法明確實施。您看到ClientBase<TChannel>的源代碼是from Metadata(請參閱在Visual Studio中的Metadata as Source)。請注意,任何函數或partial關鍵字都缺少實現。

Visual Studio將不會顯示明確實現的接口成員from Metadata(見Stack Overflow question 72686320


編輯:

明確實現的接口方法必須從直接接口來調用(這是怎麼了不同於實施含蓄)。調用它的正確方法是如下

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.

相關問題