2013-07-05 3 views
7

Ich versuche, den Typnamen T mit diesem zu bekommen:Namen der generischen Klasse Get ohne Tilde

typeof(T).Name 

Der Name der Klasse ist ConfigSettings

Statt ConfigSettings der Rückkehr es ConfigSettings`1 zurückkehrt.

Gibt es einen bestimmten Grund warum? Wie kann ich den tatsächlichen Namen ohne `1 zurückgeben?

+0

"Der Name der Klasse ist' ConfigSettings'" - Nein, ist es nicht. – AakashM

Antwort

4

Der Back-Tick gibt an, dass die Klasse ein generischer Typ ist. Wahrscheinlich ist die einfachste Sache, nur etwas aus dem Back-tick abhauen nach vorn:

string typeName = typeof(T).Name; 
if (typeName.Contains('`')) typeName = typeName.Substring(0, typeName.IndexOf("`")); 
+1

Sei nur vorsichtig mit verschachtelten Typen! – Trillian

+1

Wäre das nicht einfacher: typeof (T) .Name.Split (''') [0] ;? – user2483744

+0

user2483744, ja das funktioniert auch und ist etwas knapper, aber vielleicht immer noch etwas weniger klar, was es zu tun versucht. :) +1 für dich. –

2

Gibt es einen bestimmten Grund warum?

Dies bedeutet, dass der Typ ein generisches Argument hat.

Wie kann ich den tatsächlichen Namen ohne "1" zurückgeben?

Sie können einfach den Index von `finden (wenn es existiert) und den Teilstring vom Typnamen bis zu diesem Zeichen zurückgeben.

6

Hier ist eine Erweiterung Methode, die den „echten“ Namen eines generischen Typs zusammen mit den Namen des generischen Typparameters erhält . Es wird korrekt geschachtelte generische Typen behandeln.

public static class MyExtensionMethods 
{ 
    public static string GetRealTypeName(this Type t) 
    { 
     if (!t.IsGenericType) 
      return t.Name; 

     StringBuilder sb = new StringBuilder(); 
     sb.Append(t.Name.Substring(0, t.Name.IndexOf('`'))); 
     sb.Append('<'); 
     bool appendComma = false; 
     foreach (Type arg in t.GetGenericArguments()) 
     { 
      if (appendComma) sb.Append(','); 
      sb.Append(GetRealTypeName(arg)); 
      appendComma = true; 
     } 
     sb.Append('>'); 
     return sb.ToString(); 
    } 
} 

Hier ist ein Beispielprogramm zeigt seine Nutzung:

static void Main(string[] args) 
{ 
    Console.WriteLine(typeof(int).GetRealTypeName()); 
    Console.WriteLine(typeof(List<string>).GetRealTypeName()); 
    Console.WriteLine(typeof(long?).GetRealTypeName()); 
    Console.WriteLine(typeof(Dictionary<int, List<string>>).GetRealTypeName()); 
    Console.WriteLine(typeof(Func<List<Dictionary<string, object>>, bool>).GetRealTypeName()); 
} 

Und hier ist die Ausgabe des obigen Programms:

Int32 
List<String> 
Nullable<Int64> 
Dictionary<Int32,List<String>> 
Func<List<Dictionary<String,Object>>,Boolean> 
+0

Das ist eigentlich wirklich nett ... Ich habe es meiner Bibliothek hinzugefügt. Ich bin mir nicht sicher, wann ich es jemals benutzen werde, aber es fühlt sich gut an, wenn ich es dort habe. ;) –