IsAssignableFrom,IsInstanceOf和BaseType测试

时间:2010-02-22 18:09:00

标签: c# reflection

它只是我试图实现的服务定位器类型的模式,我想尝试将实现注册到它不属于的接口,如:

public void Add(Type interfaceType, object implementingObject)
{
    // ... check for nulls            

    // NO GOOD
    if(!implementingObject.GetType().IsAssignableFrom(interfaceType)...

    // NO GOOD
    if(!implementingObject.GetType().IsInstanceOf(interfaceType)...

    // FINALLY!
    if(!implementingObject.GetType().BaseType.IsAssignableFrom(interfaceType)...

    // ... ok, add it           
}

现在我最终想通过查看NUnit的isInstanceOf断言来使用BaseType.IsInstanceOf,但它似乎仍然是单一的。

有人可以解释为什么这有意义吗?有没有更简单的方法来做到这一点?

2 个答案:

答案 0 :(得分:4)

查看它的方式是从左到右,就像通常用语言进行作业一样。

所以在C#中,相当于调用assigningTo.IsAssignableFrom(assigningFrom)(或者你提到的任何其他方法)就是把它想象为“以下代码是否会起作用”:

<assigningTo type> variable = <instance of assigningFrom>;

将其应用于您的代码,您希望使用:

interfaceType.IsAssignableFrom(implementingObject.GetType())
interfaceType.IsAssignableFrom(implementingObject.GetType().BaseType)

您希望查看实现对象上的任何类型是否可以分配给接口类型的逻辑,或者换句话说,是否可以将实现对象分配给interfaceType。

答案 1 :(得分:0)

我想你想要:

interfaceType.IsAssignableFrom(implementingObject.GetType())

为什么可以从界面分配具体类型?