2012-07-02 13 views
5

tengo este problema:cómo reutilizar Tipo de valor devuelto para generar código fuente nueva

que desea generar un nuevo archivo de código fuente de una información de objeto.

hago algo como esto:

dictParamMapping es un Dictionary<string, Type> donde la cadena es un nombre de variable y tipo es el tipo de esa variable.

me sale el tipo para construir nuevo código usando:

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

Cuando el tipo es int, string, tabla de datos, etc ... todo funciona bien, pero cuando se trata de un diccionario, lista o cualquier otro como que devuelve algo como:

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

Cuál no es correcto construir ese nuevo código fuente. Me gustaría obtener algo como Dictionary<int, double>

¿Alguien me puede ayudar?

+2

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

+0

¿Desea obtener alias C# para tipos primitivos? – abatishchev

+0

Para abatishchev: Sí, esa es la idea. Para O. R. Mapper: GetGenericArguments me devuelve el tipo de tipo interno pero cuando una estructura de datos como Dictionary > me obliga a crear una función recursiva para detectarlo. – pasapepe

Respuesta

3

Parece que desea obtener un nombre compatible con C# de System.Type. Puede hacer esto con la clase CSharpCodeProvider.

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

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

Salida:

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

Tenga en cuenta que esto no está garantizado para ofrecerle siempre con un tipo nombre válido. En particular, los tipos generados por el compilador (como los cierres) generalmente tendrán nombres de tipos que no son válidos en C#.

+0

Perfecto !!! Muchas gracias ;) – pasapepe

2

Esta no es la forma ideal de generar código fuente en .NET. Existen formas oficialmente aceptadas de hacerlo.

La API expuesta por el marco se llama CodeDOM. Puede explorar la documentación y las muestras para tener una idea de lo que puede hacer. Here's a startup sample, que muestra cómo generar una clase. CodeDOM admite tanto C# como VB.NET como lenguajes de salida.

+0

Gracias, funciona;) – pasapepe

Cuestiones relacionadas