2012-09-30 10 views
9

Sto scrivendo un modello T4 in Visual Studio 2010 e sto generando codice basato su classi esistenti in un progetto. Il codice che devo generare dipende dagli argomenti di tipo generico dell'interfaccia implementati dalle classi, ma non vedo un modo per accedere a tali informazioni tramite l'automazione principale di Visual Studio EnvDTE. Ecco un esempio di una classe che ho bisogno di analizzare:Come ottenere i parametri di tipo generico per ENVDTE CodeInterface?

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

Da questa definizione voglio generare il codice (utilizzando T4) che assomiglia a questo:

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

Attualmente, il codice nel mio template T4 sembra un po 'come questo:

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

Ma come faccio ad ottenere gli argomenti di tipo generico di un CodeInterface?

+0

perché no 'Tipo [] = @ tipi interface.GenericTypeArguments()'? –

+0

@Cong: E ​​come ottengo esattamente l'istanza Type dell'interfaccia? Non dimenticare che l'interoperabilità di Visual Studio funziona con istanze di 'CodeClass', non con' Type'. – Steven

+1

Sto avendo lo stesso problema, ma è peggio in quanto ImplementedInterfaces ha un conteggio pari a 0. Ci deve essere un modo migliore per ottenere i generici su un'implementazione di classe ... –

risposta

6

Non è bello, ma questo fa il trucco per me:

CodeInterface @interface; 

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