2013-04-02 7 views
8

Wie ist es möglich, die abstrakte Klasse System.ServiceModel.ClientBase IDisposable Schnittstelle zu implementieren, wenn die Dispose() Methodendeklaration nicht sichtbar/deklariert ist?ClientBase implementiert IDisposable Mitglied

Wenn ich versuche, das gleiche ich einen Fehler zu tun und kann nicht

abstract class ATeste : IDisposable 
{ 
} 

'Ateste' kompilieren nicht implementiert Schnittstellenmember 'System.IDisposable.Dispose()'

I‘ m mit VS 2010 und Framework 4.0.

Überprüfen Sie die Client Erklärung:

// 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; } 
    } 
} 

Getestet habe ich wieder, aber diesmal explicity IDisposable implementieren. Jetzt macht es Sinn,

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

class Test : ATest 
{ 
} 

Nun, ich kann nicht die Methode Dispose() zugreifen, wenn ich die Testklasse instanziiert:

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

ist, ich bin nicht sicher, wo der Code, den Sie aus gepostet kam, aber nach [der Dokumentation] (http: // msdn. microsoft.com/en-us/library/bb340248.aspx) es implementiert 'IDisposable.Dispose' explizit –

+0

+1 für jemanden, der zeigt, wie man' Dispose' explizit in seiner 'ATeste' Klasse implementiert. –

Antwort

8

using explicit interface implementation.

IDisposable ist sichtbar und kann als

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

Ich habe es jetzt getestet. Du hast recht, danke. Und Entschuldigung für meine Noob-Frage. –

3

ClientBase<TChannel> Geräte aufgerufen werden IDisposable mit explicit interface implementation.

Die Implementierung für diese enge nur Anrufe:

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

Wie so ziemlich jeder hat darauf hingewiesen, ist die Interface-Methode explizit umgesetzt. Der Quellcode, den Sie für ClientBase<TChannel> sehen, ist from Metadata (in Visual Studio siehe Metadata as Source). Beachten Sie die fehlende Implementierung für jede Funktion oder ein partial Schlüsselwort.

Visual Studio wird nicht explizit Schnittstelle Mitglieder from Metadata implementiert zeigen (siehe Stack Overflow question 72686320)


Edit:

Eine explizit implementierte Schnittstelle Methode muss direkt von der Schnittstelle aufgerufen werden (dies ist es, wie unterscheidet sich von einem, das implizit implementiert wurde ). Der richtige Weg, es zu nennen, ist als

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

folgt Das Ergebnis Unhandled Exception: System.NotImplementedException: The requested feature is not implemented.