ClientBase不实现IDisposable成员

如果Dispose()方法声明不可见/声明,System.ServiceModel.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 : ICommunicationObject, IDisposable where TChannel : class { // Summary: // Initializes a new instance of the System.ServiceModel.ClientBase // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 // 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 object. // // Returns: // A System.ServiceModel.ChannelFactory object. public ChannelFactory 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 object. // // Returns: // The value of the System.ServiceModel.CommunicationState of the object. public CommunicationState State { get; } // Summary: // Causes the System.ServiceModel.ClientBase object to transition // immediately from its current state into the closed state. public void Abort(); // // Summary: // Causes the System.ServiceModel.ClientBase 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(); protected void InvokeAsync(ClientBase.BeginOperationDelegate beginOperationDelegate, object[] inValues, ClientBase.EndOperationDelegate endOperationDelegate, SendOrPostCallback operationCompletedCallback, object userState); // // Summary: // Causes the System.ServiceModel.ClientBase object to transition // from the created state into the opened state. public void Open(); // Summary: // A delegate that is used by System.ServiceModel.ClientBase.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.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.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object) // to System.ServiceModel.ClientBase.BeginOperationDelegate. // // Parameters: // result: // The result returned by the call made by System.ServiceModel.ClientBase.InvokeAsync(System.ServiceModel.ClientBase.BeginOperationDelegate,System.Object[],System.ServiceModel.ClientBase.EndOperationDelegate,System.Threading.SendOrPostCallback,System.Object)to // System.ServiceModel.ClientBase.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 { } 

现在,我在实例化Test Class时无法访问Dispose()方法:

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

使用显式接口实现 。

IDisposable是可见的,可以调用为

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

正如每个人都指出的那样,接口方法是明确实现的。 您在ClientBase中看到的源代码from Metadata (请参阅Visual Studio中的元数据作为源 )。 请注意,缺少任何函数或partial关键字的实现。

Visual Studio不会显示from Metadata显式实现的接口成员(请参阅Stack Overflow问题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.

ClientBase使用显式接口实现实现IDisposable

这个实现只是调用close:

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