C# ClientBase不';无法实现IDisposable成员
如果Dispose()方法声明不可见/声明,System.ServiceModel.ClientBase抽象类如何实现IDisposable接口 如果我尝试做同样的事情,我会得到一个错误,无法编译C# ClientBase不';无法实现IDisposable成员,c#,.net,wcf,c#-4.0,idisposable,C#,.net,Wcf,C# 4.0,Idisposable,如果Dispose()方法声明不可见/声明,System.ServiceModel.ClientBase抽象类如何实现IDisposable接口 如果我尝试做同样的事情,我会得到一个错误,无法编译 abstract class ATeste : IDisposable { } “ATeste”未实现接口成员“System.IDisposable.Dispose()” 我正在使用VS2010和Framework4.0 检查ClientBase声明: // Summary: //
abstract class ATeste : IDisposable
{
}
“ATeste”未实现接口成员“System.IDisposable.Dispose()”
我正在使用VS2010和Framework4.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; }
}
}
现在,在实例化测试类时,我无法访问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
使用实现IDisposable
实现此功能只需调用close:
void IDisposable.Dispose()
{
this.Close();
}
正如几乎所有人都指出的那样,接口方法是显式实现的。您看到的
ClientBase
的源代码是元数据中的(请参见Visual Studio中的)。请注意,任何函数或partial
关键字都没有实现
Visual Studio不会显示元数据中显式实现的接口成员(请参阅)
编辑:
必须直接从接口调用显式实现的接口方法(这就是它与隐式实现的接口方法的不同之处)。正确的调用方法如下
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();
}
}
结果是未处理的异常:System.NotImplementedException:请求的功能未实现。
我不确定您发布的代码来自何处,但是根据它实现了IDisposable.Dispose
显式+1,用于演示如何在他的ATeste
类中显式实现Dispose
。我现在测试了它。你说得对,谢谢。对不起我的问题。
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();
}
}