11

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<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();
4

3 に答える 3

11

明示的なインターフェイスの実装を使用します

IDisposable表示され、次のように呼び出すことができます

var client = new WCFTestServiceClient(); // assumingWCFTestServiceClient is WCF client proxy that inherits from ClientBase
(client as IDisposable).Dispose();
于 2013-04-02T17:47:22.367 に答える
8

ほとんどの人が指摘しているように、インターフェイス メソッドは明示的に実装されています。表示されているソース コードは次のとおりClientBase<TChannel>ですfrom Metadata(「Visual Studioのソースとしてのメタデータ」を参照)。partial関数またはキーワードの実装がないことに注意してください。

Visual Studio は、明示的に実装されたインターフェイス メンバーを表示しませんfrom Metadata(スタック オーバーフローの質問 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.

于 2013-04-02T18:02:49.007 に答える
4

ClientBase<TChannel>明示的なインターフェイスの実装IDisposableを使用して実装します。

これの実装は close を呼び出すだけです:

void IDisposable.Dispose()
{
    this.Close();
}
于 2013-04-02T17:48:00.853 に答える