Type.GetInterface和嵌套类型

时间:2009-02-09 15:14:09

标签: .net reflection

我刚刚发现了一个使用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(IStandardInterface)
  • 嵌套的值为null

这种行为是预期还是错误?如果有预期,你可以解释一下原因吗?

我使用.net Framework版本3.5 SP1。

3 个答案:

答案 0 :(得分:4)

扩展Marc的答案。

虽然没有记录,但GetInterface API会根据最后一个“。”的位置分解您传入的名称。在名字里。一切都在“。”的右边。将被假定为相关接口的简称。

这给嵌套类型带来了问题,因为它们的名称是“ContainingTypeName + NestedTypeName”。因此,当您将全名传递给GetInterface时,它实际上最终会找到一个名为“Program + INestedInterface”的接口,它将找不到它。

答案 1 :(得分:2)

它看起来像是处理嵌套名称的“+”标记的错误...以下(使用LINQ作弊)有效:

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

当然,在大多数情况下,您只需使用isas(或者IsAssignableFrom)来测试界面......这里的用例是什么?< / p>

答案 2 :(得分:1)

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

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

原始答案:

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

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

我在过去将其转换为名称时遇到了问题。我想一般来说,如果可以,你应该继续使用实际的Type对象。