2009-06-22 8 views
1

Ich arbeite an einem Visual Studio 2008-Add-In, das Datenzugriffscode generiert, indem die Methodensignatur kombiniert mit einer Reihe von Optionen betrachtet wird, die der Benutzer in einem Dialog eingibt.ITypeResolutionService löst keine Typen

Zur Analyse der Methodensignatur verwende ich den ITypeResolutionService von Visual Studio, um einen Typ zu suchen, der entweder im aktuellen Projekt, in den referenzierten Projekten oder in den referenzierten Assemblys vorhanden ist.

Dazu habe ich folgende Funktionen:

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

Es nicht-generische Typen nicht lösen, aber leider auf generische Typen nicht funktioniert. Hat jemand eine Idee, wie das obige Snippet auch für generische Typen funktioniert?

Antwort

2

Der Typ eines generischen Typs ist der Typ seines Typparameters zur Laufzeit. Zur Entwurfszeit hat ein generischer Typ keinen Typ, da der parametrisierte Typ nicht angegeben wurde. Es funktioniert wahrscheinlich nicht, weil zum Zeitpunkt des Aufrufs von GetType keine Klasseninstanz existiert.

Dies ist die gleiche Argumentation, die verhindert, dass generische Typen als Argumente verwendet werden. Sie können nicht einen generischen Typ angeben, ohne die tatsächliche Art des T.

+0

Angabe Das ist richtig, aber ich bin den folgenden Typ Angabe gelöst werden: „System.Collections.ObjectModel.Collection “ Diese doesn‘ t richtig zu lösen. Anwenden der Logik, die Sie gerade beschrieben habe ich auch versucht, die folgenden: "System.Collections.ObjectModel.Collection'1 [[MyNamespace.Client]]" Dies funktioniert jedoch auch nicht. –

+0

Wenn ich die GetType-Methode richtig verstehe, akzeptiert sie keine laufende Instanz als Parameter, sondern den Namen eines Typs. Ich sehe nicht, wie sich das auf eine laufende Instanz auswirkt. Die GetType-Methode spiegelt höchstwahrscheinlich die Klassendefinition wider, um ihre Typinformationen zu erhalten. –

+0

Ich entdeckte, dass wenn ich zuerst auflösen ("MyNamespace.Client") und System.Collections.ObjectModel.Collection_1 [[MyNamespace.Client]] auflösen, danach funktioniert es und ich bekomme den richtigen Typ. Sieht aus wie die Assembly für das generische Argument nicht geladen ist. –

Verwandte Themen