gpt4 book ai didi

c# - 为什么这个对象的类型通过反射显示没有接口(interface),尽管至少实现了两个?

转载 作者:可可西里 更新时间:2023-11-01 09:08:36 26 4
gpt4 key购买 nike

首先,一个按预期工作的示例:(所有代码都在 VS2008 即时窗口中执行)

25 is IComparable
>> true

25.GetType().GetInterfaces()
>> {System.Type[5]}
>> [0]: {Name = "IComparable" FullName = ...
>> [1]: {Name = "IFormattable" FullName = ...
>> ...

到目前为止一切顺利。现在让我们尝试一个通过基类型继承接口(interface)的对象:

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"}

这里也没有惊喜。为什么下面的代码没有显示任何接口(interface):

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 is ICommunicationObject,此时解释 wcfChannel is IMyServiceApi 的答案是正确的,无法解释.)

最佳答案

因为wcfChannel的类型就是接口(interface)本身:

>> channel.GetType().FullName
"MyService.IMyServiceApi"

>> channel.GetType().IsInterface
true

>> channel.GetType() == typeof(IMyServiceApi)
true

.GetInterfaces() 仅返回接口(interface)继承或实现,而不返回接口(interface)本身。

不可否认,对象实例实际上是接口(interface)类型是不寻常的,但是正如您在对该问题的评论中提到的那样,该对象实际上是一个透明代理。该代理不知道实际的接口(interface)实现并且只关心接口(interface)是有意义的。 .GetType() 返回接口(interface)这一事实使代理尽可能透明。

关于c# - 为什么这个对象的类型通过反射显示没有接口(interface),尽管至少实现了两个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2364759/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com