2012-09-30 12 views
9

Ich schreibe eine T4-Vorlage in Visual Studio 2010 und erzeuge Code basierend auf vorhandenen Klassen in einem Projekt. Der Code, den ich generieren muss, hängt von den generischen Typargumenten der Schnittstelle ab, die die Klassen implementieren, aber ich sehe keine Möglichkeit, über die Visual Studio-Kernautomatisierung EnvDTE auf diese Informationen zuzugreifen. Hier ist ein Beispiel einer Klasse, die wir analysieren müssen:Wie erhalten Sie die generischen Typparameter für ein ENVDTE CodeInterface?

public class GetCustomerByIdQuery : IQuery<Customer> 
{ 
    public int CustomerId { get; set; } 
} 

Aus dieser Definition I-Code generiert werden soll (unter Verwendung von T4), die wie folgt aussieht:

[OperationContract] 
public Customer ExecuteGetCustomerByIdQuery(GetCustomerByIdQuery query) 
{ 
    return (Customer)QueryService.ExecuteQuery(query); 
} 

Derzeit ist der Code in meinem T4-Vorlage sieht ein bisschen wie folgt aus:

CodeClass2 codeClass = GetCodeClass(); 

CodeInterface @interface = codeClass.ImplementedInterfaces 
    .OfType<CodeInterface>() 
    .FirstOrDefault(); 

// Here I want to do something like this, but this doesn't work: 
// CodeClass2[] arguments = @interface.GetGenericTypeArguments(); 

Aber wie bekomme ich die generischen Typargumente einer CodeInterface?

+0

warum nicht 'Type [] Typen = @ interface.GenericTypeArguments()'? –

+0

@Cuong: Und wie bekomme ich diese Type-Instanz der Schnittstelle genau? Vergessen Sie nicht, dass Visual Studio Interop mit 'CodeClass' Instanzen arbeitet, nicht mit' Type'. – Steven

+1

Ich habe das gleiche Problem, aber es ist schlimmer, dass die Implementierten Schnittstellen eine Anzahl von 0 hat. Es muss einen besseren Weg geben, um die Generika für eine Klassenimplementierung zu bekommen ... –

Antwort

6

Es ist nicht schön, aber das funktioniert der Trick für mich:

CodeInterface @interface; 

// FullName = "IQuery<[FullNameOfType]> 
string firstArgument = @interface.FullName.Split('<', '>')[1];