6

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

我今天在回家的路上一直在想这件事,但我想不通。也许我问错了问题?也许我在问一个愚蠢的问题?:)

这是某种忍者技巧吗?

4

2 回答 2

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
}

这有时非常有用。例如,通常IDisposable在首选 API 调用的类中实现.Close()。通过IDisposable显式实现,您“隐藏”了该Dispose()方法,但仍允许通过 using 语句使用类实例。

于 2012-08-07T22:50:02.363 回答
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

于 2012-08-07T22:57:05.347 回答