2012-07-02 6 views
5

ho questo problema:Come riutilizzo Tipo valore restituito per generare il codice sorgente di nuova

voglio generare un nuovo file di codice sorgente da un oggetto informazioni.

Faccio qualcosa di simile:

dictParamMapping è un Dictionary<string, Type> in cui la stringa è un nome di variabile e tipo è il tipo di quella variabile.

ottengo il tipo di costruire il nuovo codice utilizzando:

dictParamMapping[pairProcess.Value].Type.Name (or FullName) 

Quando Tipo è int, string, DataTable ecc ... tutto funziona bene, ma quando si tratta di un dizionario, la lista o di qualsiasi altro genere essa restituisce qualcosa del tipo:

System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Double, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

Quale non è corretto per costruire quel nuovo codice sorgente. Mi piacerebbe ottenere qualcosa come Dictionary<int, double>

Qualcuno può aiutarmi?

+2

Hai esaminato ['GetGenericTypeDefinition'] (http://msdn.microsoft.com/en-us/library/system.type.getgenerictypedefinition.aspx) e [' GetGenericArguments'] (http: // msdn. microsoft.com/en-us/library/system.type.getgenericarguments.aspx)? –

+0

Quindi vuoi ottenere l'alias C# per i tipi primitivi? – abatishchev

+0

Per abatishchev: Sì, questa è l'idea. Per O. R. Mapper: GetGenericArguments restituisce il tipo di tipo interno ma quando una struttura di dati come Dizionario > mi obbliga a creare una funzione ricorsiva per rilevarlo. – pasapepe

risposta

3

in cui sembra voler ottenere un C# nome compatibile da un System.Type. Puoi farlo con la classe CSharpCodeProvider.

var typeReference = new CodeTypeReference(typeof(Dictionary<int, double>)); 

using (var provider = new CSharpCodeProvider()) 
    Console.WriteLine(provider.GetTypeOutput(typeReference)); 

uscita:

System.Collections.Generic.Dictionary<int, double> 

Nota che questo non è garantito per fornire sempre con un nome-tipo valido. In particolare, i tipi generati dal compilatore (come per le chiusure) avranno tipicamente nomi di tipo non validi in C#.

+0

Perfetto !!! Molte grazie ;) – pasapepe

2

Questo non è il modo ideale per generare codice sorgente in .NET. Ci sono modi ufficialmente supportati per farlo.

L'API esposta dal framework è denominata CodeDOM. Puoi esplorare la documentazione e i campioni per avere un'idea di cosa può fare. Here's a startup sample, che mostra come generare una classe. CodeDOM supporta sia C# che VB.NET come lingue di output.

+0

Grazie, funziona;) – pasapepe

Problemi correlati