偶然发现了这一点。这是我的情景:
|--> 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会失败吗?
答案 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。
因此,您需要在候选基础/接口类型上调用方法,并使用候选具体/子类型作为方法参数。
我同意这个方法的命名方式有些含糊不清。