2013-07-05 18 views
7

Próbuję uzyskać nazwę typu T używając tego:Uzyskaj nazwę klasy rodzajowe bez tyldy

typeof(T).Name 

Nazwa klasy jest ConfigSettings

Zamiast powrocie ConfigSettings to wraca ConfigSettings`1.

Czy istnieje jakiś szczególny powód, dla którego? Jak mogę zwrócić rzeczywistą nazwę bez numeru `1?

+0

"Nazwa klasy jest' ConfigSettings'" - nie, nie jest. – AakashM

Odpowiedz

4

Ten tył zwrotny wskazuje, że klasa jest typem ogólnym. Prawdopodobnie najłatwiej jest po prostu lop off niczego od tylnej kleszcza przodu:

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

Tylko uważaj z typami zagnieżdżonymi! – Trillian

+1

Czy nie byłoby to łatwiejsze: typeof (T) .Name.Split ("' ') [0] ;? – user2483744

+0

user2483744, tak, że działa również i jest nieco bardziej zwięzły, ale być może nieco mniej jasne, co próbuje zrobić. :) +1 dla ciebie. –

2

Czy istnieje jakiś szczególny powód, dla którego?

Oznacza to, że typ ma jeden ogólny typ argumentu.

Jak mogę zwrócić aktualną nazwę bez "1"?

Możesz po prostu znaleźć indeks "(jeśli istnieje) i zwrócić podłańcuch nazwy typu do tego znaku.

6

Oto metoda rozszerzenie, które dostaną „prawdziwe” imię typu rodzajowego wraz z nazwami generycznymi parametrów typu . Poprawnie obsłuży typy zagnieżdżone.

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

Oto przykładowy program pokazujący jego wykorzystania:

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

I tu jest wyjście z powyższego programu:

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

To naprawdę bardzo miłe ... Dodałem to do mojej biblioteki. Nie jestem pewna, czy kiedykolwiek go użyję, ale dobrze jest mieć go tam. ;) –