可以obj.GetType()。IsInterface是真的吗?

时间:2014-08-30 16:34:48

标签: c# reflection

在做一些几乎完全无关紧要的事情时,我脑子里浮现出一个问题:

在仅由C#代码组成的代码库中,obj.GetType().IsInterface形式的表达式是否真实?

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

  • GetType()将始终返回运行时类型。
  • 具体类型的运行时类型与调用的构造函数匹配。因此,它永远不是一个接口,因为接口不具有构造函数。
  • 匿名类型无法实现界面(如果他们这样做,他们仍然拥有匿名类类型。)
  • 实现公共接口的其他程序集的内部类的实例仍将该类作为运行时类型。
  • Using [ComImport, CoClass(typeof(MyClass))] on an interface使您看起来可以实例化它,但构造函数调用实际上实例化了引用的类。

我无法想到任何其他情况。我错过了什么,或者我猜错了吗?

1 个答案:

答案 0 :(得分:38)

  

在仅由C#代码组成的代码库中,obj.GetType().IsInterface形式的表达式是否真实?

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

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

稍微类似地,我相信你可以创建一个RealProxy的子类来拦截调用并返回一个接口类型。

如果您的意思是" GetType()中声明的object方法的返回值是否为接口类型" - 在这种情况下,我怀疑答案是否定的。