1

只是偶然发现了这个。这是我的场景:

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

 public class Model : ViewModelBase{ }

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

首先,我确保 UI 库和 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 失败?

4

1 回答 1

2

这是一个很常见的问题,当人们第一次使用IsAssignableFrom.

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

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

来自MSDN

公共虚拟布尔 IsAssignableFrom( 类型 c )

返回值类型:System.Boolean

如果 c 和当前 Type 表示相同的类型, 或者如果当前 Type 在 c 的继承层次结构中,或者如果当前 Type 是 c 实现的接口,或者如果 c 是泛型类型参数并且当前 Type 表示,则为true c的约束之一。如果这些条件都不为真,或者 c 为空,则为假。

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

我同意该方法的命名方式有些模棱两可。

于 2013-02-25T08:08:17.747 回答