2011-01-06 8 views
16
Type t = typeof(bool); 
string typeName = t.Name; 

En este simple ejemplo, typeName tendría el valor "Boolean". Me gustaría saber si/cómo puedo obtener el "bool" en su lugar.C# - ¿Obtener nombre fácil de usar de los tipos simples a través de la reflexión?

Lo mismo para int/Int32, double/Double, string/String.

+0

posible duplicado de [¿Cómo puedo obtener el nombre primitivo de un tipo en C#? ] (http://stackoverflow.com/questions/4369737/how-can-i-get-the-primitive-name-of-a-type-in-c) –

+1

Contrariamente a las respuestas dadas hasta ahora, mira el duplicar vinculado anteriormente para un enfoque más positivo :) (Suponiendo que esté contento de utilizar CSharpCodeProvider en lugar de reflexión "simple") –

Respuesta

35
using CodeDom; 
using Microsoft.CSharp; 

// ... 

Type t = typeof(bool); 

string typeName; 
using (var provider = new CSharpCodeProvider()) 
{ 
    var typeRef = new CodeTypeReference(t); 
    typeName = provider.GetTypeOutput(typeRef); 
} 

Console.WriteLine(typeName); // bool 
+2

eres mi nuevo héroe. He estado luchando con la manipulación de cadenas y expresiones regulares tratando de convertir los nombres de tipos feos generados para genéricos sin y buenos resultados. Esto funciona perfectamente! –

5

Los "nombres descriptivos", como los llama, son específicos del idioma y no están vinculados al marco. Por lo tanto, no tiene sentido tener esta información en el marco, y las pautas de diseño de MS requieren que use los nombres de los marcos para los nombres de métodos, etc. (como ToInt32, etc.).

+1

Está en el marco. Puede obtenerlo con CodeDom y CSharpCodeProvider. Ver mi respuesta para más detalles. – LukeH

2

Por lo que entiendo, bool, string, int, etc. son sólo alias para nosotros los desarrolladores de C#.

Después de que el compilador procesa un archivo, no hay más de ellos actualmente presentes.

1

no puede. Esas son todas palabras clave específicas de C#. Pero puede asignar fácilmente:

switch (Type.GetTypeCode(t)) { 
    case TypeCode.Byte: return "byte"; 
    case TypeCode.String: return "string"; 
} 

etc

+0

devuelve int para enumeraciones (ya que las enumeraciones se basan en Int32 de forma predeterminada), por lo que probablemente no es lo que quiere el OP. – CodesInChaos

1

.NET Framework en sí no sabe nada de C# palabras clave específicas. Pero dado que solo hay una docena de ellos, puede simplemente crear manualmente una tabla que contenga los nombres que desea.

Esto podría ser un Dictionary<Type,string>:

private static Dictionary<Type,string> friendlyNames=new Dictionary<Type,string>(); 

static MyClass()//static constructor 
{ 
    friendlyNames.Add(typeof(bool),"bool"); 
    ... 
} 

public static string GetFriendlyName(Type t) 
{ 
    string name; 
    if(friendlyNames.TryGet(t,out name)) 
    return name; 
    else return t.Name; 
} 

Este código no pretende sustituir Nullable<T> con T? y no transforma los genéricos en el formulario C# utiliza.

0

Yo diría que no puede porque esos nombres son específicos de C# y como tal no producirán el mismo resultado si el desarrollador desea usar VB.NET.

Obtendrá el tipo de CLR y es realmente lo que le gustaría poder recrear el tipo más adelante. Pero siempre puedes escribir un mapeador de nombres.

0

Siempre se puede crear un diccionario para traducir los nombres de C# a los "amigos" que desee:

Dictionary<System.Type, string> dict = new Dictionary<System.Type, string>(); 
dict[typeof(System.Boolean)] = "bool"; 
dict[typeof(System.string)] = "string"; 
// etc... 
Cuestiones relacionadas