如果方法不可见,WCF代理如何实现ICommunicationObject?

时间:2012-08-07 22:48:40

标签: wcf interface channelfactory implements

WCF通道(通过ChannelFactory创建)如何实现ICommunicationObject,但是不公开Close()方法,例如,除非您将代理转换为ICommunicationObject?这有意义吗?

我在今天回家的路上想到了这一点,无法在脑海中想出来。也许我问的是错误的问题?也许我问一个愚蠢的问题? :)

这是一种忍者伎俩吗?

2 个答案:

答案 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