2015-06-25 4 views
1

Я использую SDK ReSharper 8 и хочу найти все наследования определенного общего интерфейса, где общий тип - это особый тип. У меня есть asked a more general question который получил большую часть пути, но я только в состоянии найти любую реализацию ICommandHandler<T> и не один реализации, я хочу, ICommandHandler<TestCommand>Как создать «ITypeElement» с представлением закрытого родового типа в плагине ReSharper?

это код у меня есть:

foreach (var psiModule in declaredElement.GetPsiServices().Modules.GetModules()) 
{ 
    IDeclaredType genericType = TypeFactory.CreateTypeByCLRName("HandlerNavigationTest.ICommandHandler`1", psiModule, theClass.ResolveContext); 
    var genericTypeElement = genericType.GetTypeElement(); 
    if (genericTypeElement != null) 
    {      
     var theType = TypeFactory.CreateType(originalTypeElement); 
     var commandHandlerType = TypeFactory.CreateType(genericTypeElement,theType); 
     var handlerTypeelement = commandHandlerType.GetTypeElement(); 
     solution.GetPsiServices().Finder.FindInheritors(handlerTypeelement, searchDomainFactory.CreateSearchDomain(solution, true), 
     inheritorsConsumer, NullProgressIndicator.Instance); 
     var inheritedInstance= inheritorsConsumer.FoundElements.First(); 
     var sourceFile = inheritedInstance.GetSourceFiles().First(); 
    } 
} 

если I tooltip commandHandlerType после этой строки:

var commandHandlerType = TypeFactory.CreateType (genericTypeElement, theType);

Я вижу, что тип правильно указано:

Generic type exists!

Но тогда, когда я получаю ITypeElement от этого типа, чтобы пройти в мой поиск, используя эту строку

var handlerTypeelement = commandHandlerType.GetTypeElement(); 

Я, кажется, потеряли тип:

Generic type lost!

И поэтому мой поиск находит все реализации ICommandHandler<T>.

Так что мой вопрос: как мне создать ITypeElement, который представляет закрытый тип, который я хочу найти?

Или, альтернативно: как я могу найти возвращаемую коллекцию наследователей для типа, который имеет класс, с которого я начал, в качестве параметра типового типа?

ответ

1

А, это имеет смысл. ITypeElement - это экземпляр IDeclaredElement, что означает, что это то, что имеет объявление, такое как объявление класса или интерфейса. Поэтому, когда вы получаете IType, который представляет ваш закрытый родословный, он состоит из ITypeElement, который представляет общий тип (ICommandHandler) и ISubstitution, который представляет разрешенные общие параметры типа (AnotherCommand). Когда вы вызываете IType.GetTypeElement(), он возвращает часть элемента типа пары элементов/подстановки типа, которая является открытым объявленным объявленным элементом (поскольку объявление интерфейса может быть только открыто).

Я думаю, вам, возможно, придется воспользоваться альтернативным подходом и найти всех наследников (разработчиков) ITypeHandler<T> и отфильтровать их у потребителя. Переданный потребителю FindResult может быть отключен до FindResultInheritedElement, который предоставит вам объявленный элемент, представляющий класс, который реализует ITypeHandler<T>. Вы должны иметь возможность перемещать интерфейсы этих элементов, чтобы увидеть, что они реализуют, и принимать только те результаты поиска, которые реализуют правильные T. Я думаю, что TypeElementUtil поможет здесь получить все супер типы (базовые типы + интерфейсы) объявленного элемента.

+0

Как я уже создал общий тип ранее, я мог бы просто использовать метод GetAllSuperTypes() ', а затем проверить каждый возвращаемый тип, чтобы узнать, был ли это общий тип, который мне интересен, и если бы это было тогда, я мог бы перейти к Это. Так что теперь мне нужно, чтобы все это работало. Просто нужно сделать типы команд/обработчиков доступными для чтения из конфигурации, а затем он должен быть достаточно гибким, чтобы в целом был полезен. –

+0

Спасибо за помощь. Очень признателен. –

+0

ОК, поэтому [другой блокиратор] (http://stackoverflow.com/questions/31168095/how-do-i-get-a-window-context-so-i-can-create-navigationoptions-in-a-resharper -p), если вы можете подтолкнуть меня в правильном направлении, пожалуйста ... –