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

The*_*kis 25 c# reflection

在做一些几乎完全无关紧要的事情时,一个问题突然出现在我脑海中:

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

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

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

我想不出任何其他情况.我错过了什么,或者我猜对了吗?

Jon*_*eet 38

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

如果你的意思是"将GetType()声明的方法的返回值object永远是一个接口类型" - 在这种情况下,我怀疑答案是否定的.

  • 用于证明它的+1可以完成,但有些事情最好不要教.如果我*必须*修复执行此操作的代码.我要来找你@Jon.只是在开玩笑.:) (7认同)
  • 狡猾.我想这值得两三个徽章.:) (5认同)