首先是一个可以预期的工作的例子:(所有代码都在VS2008立即窗口中执行)
25 is IComparable >> true 25.GetType().GetInterfaces() >> {System.Type[5]} >> [0]: {Name = "IComparable" FullName = ... >> [1]: {Name = "IFormattable" FullName = ... >> ...
到现在为止还挺好.现在让我们尝试一个通过基本类型继承接口的对象:
class TestBase : IComparable { public int Compareto(object obj) { throw new NotImplementedException(); } } class TheTest : TestBase { }
在即时窗口中:
(new Thetest()) is IComparable >> true (new Thetest()).GetType().GetInterfaces() >> {System.Type[1]} >> [0]: {Name = "IComparable" FullName = "System.IComparable"}
wcfChannel = ChannelFactory<IMyServiceApi>.CreateChannel(binding,endpointAddress); wcfChannel is IMyServiceApi && wcfChannel is ICommunicationObject >> true typeof(IMyServiceApi).IsInterface && typeof(ICommunicationObject).IsInterface >> true wcfChannel.GetType().GetInterfaces() >> {System.Type[0]}
以上所有这些都可以同时实现?
(编辑:添加wcfChannel是上面的ICommunicationObject,这是在这个时候无法解释的解释如何wcfChannel是IMyServiceApi是真的.)
解决方法
这是因为wcfChannel的类型是接口本身:
>> channel.GetType().FullName "MyService.IMyServiceApi" >> channel.GetType().IsInterface true >> channel.GetType() == typeof(IMyServiceApi) true
.GetInterfaces()只返回继承或实现的接口,而不是接口本身.
诚然,对象实例实际上是一个接口类型是不寻常的,但正如您在该问题的评论中提到的,该对象实际上是一个透明的代理.该代理对于实际的接口实现是不可知的,只关心接口是有意义的.事实上,.GetType()返回的接口使代理尽可能透明.
原文地址:https://www.jb51.cc/csharp/95630.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。