Два типа не равны, что должно быть - PullRequest
15 голосов
/ 02 сентября 2010

Я пытаюсь отладить некоторый код, который использует отражение для загрузки плагинов

Вот код отладки:

Type a = methodInfo.GetParameters()[0]
    .ParameterType.BaseType;
Type b = typeof(MessageContext);
Debug.WriteLine(a.AssemblyQualifiedName);
Debug.WriteLine(b.AssemblyQualifiedName);
Debug.WriteLine(a.Equals(b));

А вот его вывод:

OrtzIRC.Common.MessageContext, OrtzIRC.Common, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = нольOrtzIRC.Common.MessageContext, OrtzIRC.Common, версия = 1.0.0.0, культура = нейтральная, PublicKeyToken = нольНеверно

Я не понимаю, что может отличить эти два типа?

Ответы [ 4 ]

17 голосов
/ 02 сентября 2010

Один и тот же класс / тип, загруженный разными доменами приложений [.NET] или загрузчиками классов [Java], не будут сравниваться одинаково и не могут быть назначены друг другу напрямую.

Скорее всего, у вас есть две копии библиотеки DLL, содержащей этот тип - одна загружена основной программой, а другая - одним из Assembly.Load*(...) методов?

Попробуйте отобразить / сравнить свойства:
a.Assembly.Equals(b.Assembly)
и
a.Assembly.Location.Equals(b.Assembly.Location)

Как правило, вам нужна только одна копия каждой библиотеки DLL и ее загрузка в один домен приложения.

3 голосов
/ 02 сентября 2010

Это может произойти, если два типа загружены из разных версий сборки. .NET рассматривает их как разные, не связанные типы. Проверка

Debug.WriteLine (a.AssemblyQualifiedName) ;
Debug.WriteLine (b.AssemblyQualifiedName) ;
0 голосов
/ 02 сентября 2010

Попробуйте: Debug.Writeline(a.Equals(b));

0 голосов
/ 02 сентября 2010

Вот как вы должны сравнивать типы:

C # Сравнение типов объектов

Я думаю, что ваша проблема находится в иерархии типов ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...