Pregunta

Estoy trabajando en un complemento de Visual Studio 2008 que generará código de acceso a datos al observar la firma del método combinada con un conjunto de opciones que el usuario ingresa en un diálogo.

Para analizar la firma del método, uso el ITypeResolutionService de Visual Studio para buscar un tipo que existe en el proyecto actual, en los proyectos a los que se hace referencia o en los ensamblados a los que se hace referencia.

Para esto creé la siguiente funcionalidad:

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

Resuelve tipos no genéricos, pero lamentablemente no funciona en tipos genéricos. ¿Alguien tiene una idea sobre cómo hacer que el fragmento anterior funcione también para los tipos genéricos?

¿Fue útil?

Solución

El tipo de un tipo genérico es el tipo de su parámetro de tipo en tiempo de ejecución. En tiempo de diseño, un tipo genérico no tiene tipo porque el tipo parametrizado no se ha especificado. Probablemente no funcione porque no existe una instancia de clase en el momento en que se llama a GetType.

Este es el mismo razonamiento que impide que los tipos genéricos se utilicen como argumentos. No puede especificar un tipo genérico sin especificar el tipo real de la T.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top