我刚刚发现了一个使用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。
这种行为是预期还是错误?如果有预期,你可以解释一下原因吗?
我使用.net Framework版本3.5 SP1。
答案 0 :(得分:4)
扩展Marc的答案。
虽然没有记录,但GetInterface API会根据最后一个“。”的位置分解您传入的名称。在名字里。一切都在“。”的右边。将被假定为相关接口的简称。
这给嵌套类型带来了问题,因为它们的名称是“ContainingTypeName + NestedTypeName”。因此,当您将全名传递给GetInterface时,它实际上最终会找到一个名为“Program + INestedInterface”的接口,它将找不到它。
答案 1 :(得分:2)
它看起来像是处理嵌套名称的“+”标记的错误...以下(使用LINQ作弊)有效:
var nested = typeof(NestedClass).GetInterfaces()
.SingleOrDefault(i => i.FullName == nestedIfName);
当然,在大多数情况下,您只需使用is
或as
(或者IsAssignableFrom
)来测试界面......这里的用例是什么?< / p>
答案 2 :(得分:1)
我没有正确地阅读这个问题。这应该做你需要的。
Boolean isSubClass = typeof(NestedClass).GetInterfaces().Contains(typeof(INestedInterface));
原始答案:
我不确定这是不是一个错误,但这是我用来测试一个类型是否来自另一个类型的代码。
typeof(NestedClass).IsInstanceOfType(typeof(IStandardInterface))
我在过去将其转换为名称时遇到了问题。我想一般来说,如果可以,你应该继续使用实际的Type对象。