C# obj.GetType()IsInterface是否为真?

C# obj.GetType()IsInterface是否为真?,c#,reflection,C#,Reflection,在做一些几乎完全不相关的事情时,我突然想到一个问题: 形式为obj.GetType().IsInterface的表达式在完全由C代码组成的代码库中是否为真? 我怀疑答案是否定的,因为: GetType()将始终返回运行时类型 具体类型的运行时类型与调用的构造函数匹配。因此,它永远不是一个接口,因为接口没有构造函数 匿名类型无法实现接口(如果实现了,则仍然会使用匿名类类型) 实现公共接口的其他程序集的内部类的实例仍将该类作为运行时类型 使它看起来像您可以实例化它,但构造函数调用实际上实例化了引用

在做一些几乎完全不相关的事情时,我突然想到一个问题:

形式为
obj.GetType().IsInterface
的表达式在完全由C代码组成的代码库中是否为真?

我怀疑答案是否定的,因为:

  • GetType()
    将始终返回运行时类型
  • 具体类型的运行时类型与调用的构造函数匹配。因此,它永远不是一个接口,因为接口没有构造函数
  • 匿名类型无法实现接口(如果实现了,则仍然会使用匿名类类型)
  • 实现公共接口的其他程序集的内部类的实例仍将该类作为运行时类型
  • 使它看起来像您可以实例化它,但构造函数调用实际上实例化了引用的类
我想不出还有别的情况。我是遗漏了什么,还是我的猜测是正确的

obj.GetType().IsInterface
形式的表达式在完全由C代码组成的代码库中是否为真

是的-但可能不是你想的那样:

using System;

public class EvilClass
{
    public new Type GetType()
    {
        return typeof(IDisposable);
    }
}

class Test
{
    static void Main()
    {
        EvilClass obj = new EvilClass();
        Console.WriteLine(obj.GetType().IsInterface); // True
    }
}
稍微类似地,我相信您可以创建一个子类,它将拦截调用并返回接口类型


如果您的意思是“在
object
中声明的
GetType()
方法的返回值是否曾经是一个接口类型”——那么我怀疑答案是否定的。

。我想那值两三枚徽章+为了证明这是可以做到的,但有些事情最好不要教。如果我必须修复做这件事的代码。我会去找你的,乔恩。只是开玩笑。:)对于COM类,
new ISomeComInterface()
仅仅是一个编译器技巧:它将它转换成其他东西,或者
new SomeComClass()
或者
Activator.CreateInstance(Type.GetTypeFromCLSID(SomeComGuid))
。无论如何,运行时都不会看到正在创建的接口,因此我认为这不能用于获取
GetType()
以返回接口。@hvd:yes,这也是我的结论。将删除有关COM的位。