2009-06-22 1 views
1

Я работаю над надстройкой visual studio 2008, которая будет генерировать код доступа к данным, просмотрев подпись метода в сочетании с набором опций, которые пользователь вводит в диалог.ITypeResolutionService не разрешает любые типы

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

Для этого я создал следующие функциональные возможности:

private ITypeResolutionService _typeResolutionService; 
private ITypeDiscoveryService _typeDiscoveryService; 

/// <summary> 
/// Initializes a new instance of the TypeResolver class. 
/// </summary> 
public TypeResolver(VisualStudioServiceProvider serviceProvider, Project project) 
{ 
    IVsSolution solution = serviceProvider.GetService<IVsSolution>(); 
    DynamicTypeService typeResolver = serviceProvider.GetService<DynamicTypeService>(); 

    IVsHierarchy hierarchy = null; 
    solution.GetProjectOfUniqueName(project.UniqueName, out hierarchy); 

    _typeResolutionService = typeResolver.GetTypeResolutionService(hierarchy); 
    _typeDiscoveryService = typeResolver.GetTypeDiscoveryService(hierarchy); 
} 

/// <summary> 
/// Resolves a type in the current solution 
/// </summary> 
/// <param name="name">Name of the type to resolve</param> 
/// <returns>Returns the resolved type; otherwise null</returns> 
public Type Resolve(string name) 
{ 
    return _typeResolutionService.GetType(name, true); 
} 

Это разрешить необщего типов, но, к сожалению, не работает в общих типов. Есть ли у кого-нибудь идея о том, как получить вышеприведенный фрагмент, работающий и для общих типов?

ответ

2

Тип универсального типа является типом его параметра типа во время выполнения. Во время разработки общий тип не имеет типа, поскольку параметризованный тип не указан. Вероятно, это не работает, потому что не существует экземпляра класса во время вызова GetType.

Это та же самая аргументация, которая запрещает использование универсальных типов в качестве аргументов. Вы не можете указать общий тип без указания фактического типа T.

+0

Это правильно, однако я указать следующий тип, чтобы решить: «System.Collections.ObjectModel.Collection » Это Безразлично» t разрешить правильно. Применяя только что описанную логику, я также пробовал следующее: «System.Collections.ObjectModel.Collection'1 [[MyNamespace.Client]]" Это, однако, не работает. –

+0

Если я правильно понимаю метод GetType, он не принимает исполняемый экземпляр в качестве параметра, а скорее имя типа. Я не вижу, как это будет переводиться в исполняемый экземпляр. Метод GetType, скорее всего, отражает определение класса для получения информации о типе. –

+0

Я обнаружил, что когда я впервые вызываю Resolve («MyNamespace.Client») и разрешаю System.Collections.ObjectModel.Collection'1 [[MyNamespace.Client]] после этого, он работает, и я получаю правильный тип. Похоже, что сборка для общего аргумента не загружена. –