2015-11-24 7 views
0

Я пытаюсь написать свое первое расширение ReSharper и я застрял на следующей задаче:Как получить тип экземпляра из IType (Resharper 8 SDK)

Как получить разрешенную Тип от IType дескриптора из этого?

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

До сих пор я получил это

[ElementProblemAnalyzer(new[] { typeof(IInvocationExpression) })] 
public class MyAnalyzer : IElementProblemAnalyzer` 
{ 
    public void Run(ITreeNode element, ElementProblemAnalyzerData analyzerData, IHighlightingConsumer consumer) 
    { 
     ... 

     var typeArgs = meaningfulChildren.FirstOrDefault(o => o is ITypeArgumentList) as ITypeArgumentList; 

     IType psiType = typeArgs.TypeArguments[0]; 
     Type actualType = psiType.ResolvedType; // No such property 
    } 
} 

ответ

0

Вы не можете делать то, что вы просите - системы типа ReSharper является видом источника проекта, а не сборка, загружает в AppDomain. Другими словами, вы можете получить IType для класса, определенного в Foo.cs, даже если Foo.cs не был загружен. Он все равно должен иметь возможность возвращать информацию о типе, если проект не может скомпилироваться, потому что код в Bar.cs просто недействителен.

Таким образом, вы не можете преобразовать IType в System.Type без компиляции проекта и загрузки сборки в AppDomain. Но у ReSharper есть много инструментов для работы с типами в собственном представлении системы типов. Что именно ты пытаешься сделать?

+0

Я боялся, что это может быть так. Я пытаюсь построить расширение ReSharper для AutoMapper с целью, чтобы он обеспечивал выделение, если он определяет, что типы, которые вы показываете, не полностью «отображаются». Для этого мне нужно использовать вызовы 'Mapper.CreateMap ()' с фактическими типами. –

+0

Если вы можете достаточно легко реплицировать логику, вы сможете записать ее с помощью ReSharper - существуют различные утилиты, которые будут проверять совместимость двух типов (на основе исходного кода). – citizenmatt

+0

К сожалению, здесь нет тривиальной совместимости - это не просто назначается в обычном смысле, это «все свойства типа назначения« гидратируются »из типа источника или любого из его дочерних свойств, если вы их сглаживаете». Я проверил и, к сожалению, они также не добавили слой абстракции поверх системы типа .Net, поэтому я не мог легко подделать его. Это может быть больше проблем, чем того стоит. Я ценю ваш совет. –