基类型相等检查失败

时间:2013-02-25 08:05:22

标签: c# .net inheritance reflection types

偶然发现了这一点。这是我的情景:

|--> BaseTypeLibrary  (contains ViewModelBase)
|--> ModelLibrary     (contains Model)
|--> Business Library (contains equality check)

 public class Model : ViewModelBase{ }

 // returns false
 bool isViewModel = (type.IsAssignableFrom(typeof(ViewModelBase)));

首先,我确保UI Library和ModelLibrary的引用指向相同的BaseTypeLibrary。这是我执行的一些检查。

 // false
 Console.WriteLine(type.IsAssignableFrom(typeof(ViewModelBase)));

 // true
 Console.WriteLine((type.BaseType == typeof(ViewModelBase)));

 // true
 Console.WriteLine((typeof(ViewModelBase).Module.FullyQualifiedName) == (type.BaseType.Module.FullyQualifiedName));

 //true
 Console.WriteLine(type.IsSubclassOf(typeof(ViewModelBase)));

有人可以解释为什么IsAssignableFrom会失败吗?

1 个答案:

答案 0 :(得分:2)

这是一个非常常见的问题,可以让人们在第一次使用IsAssignableFrom时绊倒。

在您的示例中,执行检查时需要反转实例和参数:

bool isViewModel = typeof(ViewModelBase).IsAssignableFrom(type);

来自MSDN

  

public virtual bool IsAssignableFrom(Type c)

     

返回值类型:System.Boolean

     

如果c和当前Type表示相同类型,则为true,   或者当前Type是否在c的继承层次结构中,或者如果是   current Type是c实现的接口,或者c是泛型   type参数和当前Type表示其中一个约束   c。如果这些条件均不为真,或者c为空,则返回false。

因此,您需要在候选基础/接口类型上调用方法,并使用候选具体/子类型作为方法参数

我同意这个方法的命名方式有些含糊不清。