2013-02-25 4 views
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 не удается?

+0

Как вам получить 'type'? –

ответ

2

Это довольно распространенная проблема, которая вызывает людей, когда они впервые используют IsAssignableFrom.

В вашем примере, вы должны полностью изменить экземпляр и аргумент при выполнении проверки:

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

От MSDN:

публичный виртуальный BOOL IsAssignableFrom (тип C)

Возвращаемое значение Тип: System.Boolean

true, если c и cur Тип аренды представляет собой тот же тип, или если текущий тип находится в иерархии наследования c, или текущий ток - это интерфейс, который c реализует, или если c является общим параметром типа , а текущий тип представляет одно из ограничений в. false, если ни одно из этих условий не является истинным, или если c равно null.

Так что вам нужно вызвать метод на кандидат базовый/интерфейс типа и использовать кандидат бетонный/подтип как метод аргумент.

Я согласен с тем, что метод, названный методом, несколько неоднозначен.

+0

спасибо, Ани, что сделал трюк. Не могли бы вы объяснить, почему? –

+0

Хотя это довольно очевидно ... «Модель» - это «ViewModelBase», но не наоборот ... –

Смежные вопросы