WCF 通道(通过 ChannelFactory 创建)如何实现 ICommunicationObject,但不公开 Close() 方法,例如,除非您将代理转换为 ICommunicationObject?那有意义吗?
我今天在回家的路上一直在想这件事,但我想不通。也许我问错了问题?也许我在问一个愚蠢的问题?:)
这是某种忍者技巧吗?
WCF 通道(通过 ChannelFactory 创建)如何实现 ICommunicationObject,但不公开 Close() 方法,例如,除非您将代理转换为 ICommunicationObject?那有意义吗?
我今天在回家的路上一直在想这件事,但我想不通。也许我问错了问题?也许我在问一个愚蠢的问题?:)
这是某种忍者技巧吗?
这是通过Explicit Interface Implementation完成的。
假设您有一个接口,如下所示:
public interface IFoo
{
void Foo();
}
您可以正常执行此操作:
public class Bar : IFoo
{
public void Foo() {} // Implicit interface implementation
}
或者,您可以显式实现接口成员,这需要强制转换:
public class Baz : IFoo
{
void IFoo.Foo() {} // This will require casting the object to IFoo to call
}
这有时非常有用。例如,通常IDisposable
在首选 API 调用的类中实现.Close()
。通过IDisposable
显式实现,您“隐藏”了该Dispose()
方法,但仍允许通过 using 语句使用类实例。
该类显式地Channel
实现了ICommunicationObject
接口。这是一个演示显式接口实现和隐式接口实现之间区别的示例:
internal interface IExample
{
void DoSomething();
}
class ImplicitExample : IExample
{
public void DoSomething()
{
// ...
}
}
class ExplicitExample : IExample
{
void IExample.DoSomething()
{
// ...
}
}
class Consumer
{
void Demo()
{
var explicitExample = new ExplicitExample();
// explicitExample.DoSomething(); <-- won't compile
((IExample)explicitExample).DoSomething(); // <-- compiles
var implicitExample = new ImplicitExample();
implicitExample.DoSomething(); // <-- compiles
}
}
这是关于此主题的 MSDN 文章的链接:http: //msdn.microsoft.com/en-us/library/ms173157.aspx