2012-07-02 25 views
5

mam ten problem:Jak ponowne typ zwracanej wartości do generowania kodu źródłowego nowej

Chcę, aby wygenerować nowy plik kodu źródłowego z informacji obiektu.

robię coś takiego:

dictParamMapping jest Dictionary<string, Type> gdzie łańcuch jest zmienna nazwa i typ jest typem tej zmiennej.

mam typ zbudować nowy kod za pomocą:

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

kiedy typ jest int, string, DataTable itd ... wszystko działa poprawnie, ale gdy jest to słownik, lista lub inny podobny, że to zwraca coś takiego:

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]] 

Niepoprawne budowanie tego nowego kodu źródłowego. Chciałbym uzyskać coś w rodzaju: Dictionary<int, double>

Czy ktoś może mi pomóc?

+2

Zajrzałeś do ['GetGenericTypeDefinition'] (http://msdn.microsoft.com/en-us/library/system.type.getgenerictypedition.aspx) i [' GetGenericArguments'] (http: // msdn. microsoft.com/en-us/library/system.type.getgenericarguments.aspx)? –

+0

Więc chcesz uzyskać alias C# dla typów pierwotnych? – abatishchev

+0

Do abatishchev: Tak, to jest pomysł. Do O. R. Mapper: GetGenericArguments zwraca mi typ typu wewnętrznego, ale gdy struktura danych, taka jak Dictionary > zmusza mnie do utworzenia funkcji rekursywnej w celu jej wykrycia. – pasapepe

Odpowiedz

3

Wygląda na to, że chcesz uzyskać nazwę zgodną z C# od System.Type. Możesz to zrobić z klasą CSharpCodeProvider.

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

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

wyjściowa:

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

pamiętać, że nie gwarantuje zawsze dostarczyć ważnego nazwa-typu. W szczególności typy generowane przez kompilator (na przykład dla zamknięć) będą zazwyczaj miały nazwy typów, które są nieważne w języku C#.

+0

Perfect !!! Wielkie dzięki ;) – pasapepe

2

To nie jest idealny sposób generowania kodu źródłowego w .NET. Istnieją oficjalnie obsługiwane sposoby robienia tego.

Interfejs API ujawniony przez framework nosi nazwę CodeDOM. Możesz przeglądać dokumentację i próbki, aby dowiedzieć się, co może zrobić. Here's a startup sample, pokazujący jak wygenerować klasę. CodeDOM obsługuje zarówno C#, jak i VB.NET jako języki wyjściowe.

+0

Dzięki, to działa;) – pasapepe

Powiązane problemy