WCF通道(通过ChannelFactory创建)如何实现ICommunicationObject,但是不公开Close()方法,例如,除非您将代理转换为ICommunicationObject?这有意义吗?
我在今天回家的路上想到了这一点,无法在脑海中想出来。也许我问的是错误的问题?也许我问一个愚蠢的问题? :)
这是一种忍者伎俩吗?
答案 0 :(得分:5)
这是通过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
}
这有时非常有用。例如,通常用于在首选API调用IDisposable
的类中实现.Close()
。通过显式实现IDisposable
,您可以“隐藏”Dispose()
方法,但仍然允许通过using语句使用类实例。
答案 1 :(得分:2)
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