IsAssignableFrom、IsInstanceOf和BaseType测试 (说明:这是一个提问标题,无需回答)

4
我正在尝试实现一种服务定位器模式,希望能捕获试图将实现注册到其不属于的接口的情况,示例如下:
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个回答

4

从左到右看待它,就像你通常用一种语言来完成任务时一样。

因此,在C#中,调用assigningTo.IsAssignableFrom(assigningFrom)(或您提到的任何其他方法)的等效方法是将其视为“以下代码是否有效”:

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

将其应用于您的代码中,您需要使用以下内容:
interfaceType.IsAssignableFrom(implementingObject.GetType())
interfaceType.IsAssignableFrom(implementingObject.GetType().BaseType)

这个逻辑的意思是,你想要查看实现对象中的任何类型是否可以分配给接口类型,换句话说,就是实现对象是否可以分配给interfaceType。


0

我想你想要的是:

interfaceType.IsAssignableFrom(implementingObject.GetType())

为什么一个具体类型可以从接口中赋值?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接