ITypeResolutionService не разрешает любые типы - PullRequest
1 голос
/ 22 июня 2009

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

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

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

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);
}

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

1 Ответ

2 голосов
/ 22 июня 2009

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

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

...