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

In diesem einfachen Beispiel würde typeName den Wert "Boolean" haben. Ich würde gerne wissen, ob/wie ich es stattdessen dazu bringen kann, zu sagen.C# - Erhalte benutzerfreundliche Namen einfacher Typen durch Reflektion?

Gleiches für int/Int32, double/Double, string/String.

+0

möglich Duplikat [Wie kann ich den primitiven Namen eines Typs in C# zu bekommen? ] (http://stackoverflow.com/questions/4369737/how-can-i-get-the-primitive-name-of-a-type-in-c) –

+1

Entgegen den bisher gegebenen Antworten, schauen Sie sich die an Duplizieren Sie die Verknüpfung oben für einen positiveren Ansatz :) (Angenommen, Sie verwenden CSharpCodeProvider lieber als "normale" Reflektion.) –

Antwort

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

du bist mein neuer Held. Ich hatte mit String-Manipulation und Regex zu kämpfen versucht, die hässlichen Typnamen für Generika ohne und gute Ergebnisse zu konvertieren. Das funktioniert perfekt! –

5

Die "freundlichen Namen", wie Sie sie nennen, sind sprachspezifisch und nicht an das Framework gebunden. Daher ist es nicht sinnvoll, diese Informationen im Framework zu haben, und die MS-Designrichtlinien erfordern, dass Sie die Framework-Namen für Methodennamen usw. verwenden (z. B. ToInt32 usw.).

+1

Es ist im Framework. Sie können es mit CodeDom und CSharpCodeProvider bekommen. Siehe meine Antwort für Details. – LukeH

2

Von was ich verstehe, bool, string, int, etc. sind nur Aliase für uns C# -Entwickler.

Nachdem der Compiler eine Datei verarbeitet hat, sind keine weiteren mehr vorhanden.

1

können Sie nicht. Dies sind alle C# spezifischen Keywords. Aber man kann sie leicht Karte:

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

etc

+0

gibt int für enums zurück (da Enums standardmäßig auf Int32 basieren), also wahrscheinlich nicht das, was das OP will. – CodesInChaos

1

Das .net Framework selbst nicht weiß, über C# spezifische Keywords. Da es jedoch nur ein Dutzend gibt, können Sie einfach manuell eine Tabelle erstellen, die die gewünschten Namen enthält. Dieser Code nicht Nullable<T> mit T? ersetzen und nicht verwandeln Generika in die Form C

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; 
} 

# verwendet:

ein Dictionary<Type,string> sein Dies könnte.

0

Ich würde sagen, Sie können nicht, da diese Namen für C# spezifisch sind und als solche nicht das gleiche Ergebnis erzeugen, wenn der Entwickler VB.NET verwenden wollte.

Sie erhalten den CLR-Typ und das ist wirklich, was Sie den Typ später neu erstellen möchten. Aber Sie können immer einen Namensmapper schreiben.

0

Sie können immer ein Wörterbuch erstellen, um die C# Namen für die „freundlichen“, die Sie wollen übersetzen:

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