【问题标题】:Can obj.GetType().IsInterface be true?obj.GetType().IsInterface 可以是真的吗?
【发布时间】:2014-08-30 16:34:47
【问题描述】:

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

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

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

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

我想不出任何其他情况。是我遗漏了什么,还是我的猜测正确?

【问题讨论】:

    标签: c# reflection


    【解决方案1】:

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

    有点类似,我相信你可以创建一个RealProxy 的子类,它会拦截调用并返回一个接口类型。

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

    【讨论】:

    • 狡猾的。我想这值两三个徽章。 :)
    • +1 证明它可以做到,但有些事情最好不要教。如果我曾经必须修复执行此操作的代码。我要来找你@Jon。只是开玩笑。 :)
    • 对于 COM 类,new ISomeComInterface() 只是一个编译器技巧:它将它转换为其他东西,new SomeComClass()Activator.CreateInstance(Type.GetTypeFromCLSID(SomeComGuid))。无论哪种方式,运行时都不会看到正在创建的接口,所以我认为它不能用来让GetType() 返回一个接口。
    • @hvd:是的,这也是我的结论。将删除关于 COM 的部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 2022-11-11
    相关资源
    最近更新 更多