代码之家  ›  专栏  ›  技术社区  ›  Fionn

type.getInterface和嵌套类型

  •  2
  • Fionn  · 技术社区  · 15 年前

    我刚刚发现type.getInterface和嵌套类型有一个非常奇怪的行为。

    下面的示例代码将显示问题,我正在使用接口的type.fullname检查给定类型是否从该接口派生:

    public interface IStandardInterface {}
    public class StandardClass : IStandardInterface {}
    
    class Program
    {
        public interface INestedInterface {}
        public class NestedClass : INestedInterface { }
    
        static void Main()
        {
            var stdIfName = typeof (IStandardInterface).FullName;
            var nestedIfName = typeof (INestedInterface).FullName;
    
            var std = typeof(StandardClass).GetInterface(stdIfName);
            var nested = typeof(NestedClass).GetInterface(nestedIfName);
        }
    }
    

    如果我执行上面的代码,它适用于StandardClass,但不适用于NestedClass。

    • std的值为typeof(伊斯坦布尔界面)
    • 嵌套的值为空

    这是预期的行为还是错误?如果是预期的,你能解释一下为什么吗?

    我使用.NET Framework 3.5 SP1。

    3 回复  |  直到 15 年前
        1
  •  4
  •   JaredPar    15 年前

    扩展马克的答案。

    虽然没有文档记录,但是getInterface API将根据名称中最后一个“.”的位置分解您传入的名称。将假定“.”右边的所有内容都是相关接口的短名称。

    这给嵌套类型带来了问题,因为它们的名称是“containingtypename+nestedtypename”。因此,当您将全名传递给getinterface时,它实际上最终会查找一个名为“program+inestedinterface”的接口,但它找不到该接口。

        2
  •  2
  •   Marc Gravell    15 年前

    看起来像是一个处理嵌套名称“+”标记的错误…以下方法(欺骗Linq)有效:

    var nested = typeof(NestedClass).GetInterfaces()
                .SingleOrDefault(i => i.FullName == nestedIfName);
    

    当然,在大多数情况下,你只需要 is as (或者) IsAssignableFrom )对接口进行测试…这里的用例是什么?

        3
  •  1
  •   Shaun Bowe    15 年前

    我没有正确地阅读这个问题。这应该能满足你的需要。

    Boolean isSubClass = typeof(NestedClass).GetInterfaces().Contains(typeof(INestedInterface));
    

    原始答案:

    我不确定这是否是一个bug,但这是我用来测试一个类型是否派生自另一个类型的代码。

    typeof(NestedClass).IsInstanceOfType(typeof(IStandardInterface))
    

    我以前在你把它转换成名字时遇到过问题。我认为一般情况下,如果可以的话,您应该使用实际的类型对象。