Mam następujący kod:
return "[Inserted new " + typeof(T).ToString() + "]";
Ale
typeof(T).ToString()
zwraca pełną nazwę wraz z przestrzenią nazw
Czy w ogóle istnieje możliwość uzyskania nazwy klasy (bez żadnych kwalifikatorów przestrzeni nazw?)
c#
namespaces
typeof
leora
źródło
źródło
string1 + anything.ToString() + string2
jest zbędne.ToString
Jeśli to zrobisz, kompilator wstawi wywołanie automatyczniestring1 + anything + string2
.Type
instancji (w odpowiedzitypeof(..)
), jestem pewien, że sam toOdpowiedzi:
źródło
Name
nie uwzględnia parametrów typu.this.GetType().Name
,this.GetType().FullName
itp jeśli do czynienia z przypadkami.Name
również nie uwzględnia typów zagnieżdżonych!Wypróbuj to, aby uzyskać parametry typu dla typów ogólnych:
Może nie najlepsze rozwiązanie (z powodu rekurencji), ale działa. Wyjścia wyglądają następująco:
źródło
StringBuilder
w każdym wywołaniu rekurencyjnym (nawet podstawowym, gdy nie jest używane), ale ignorujestring.Join
tymczasową i LINQ lambda. Po prostu używaj,String
dopóki nie zorientujesz się, że to wąskie gardło. / rantskorzystaj z ( Właściwości typu )
źródło
typeof (T) .Name;
źródło
Po C # 6.0 (włącznie) możesz użyć nameof expression:
Uwaga!
nameof
nie pobiera typu środowiska wykonawczego obiektu bazowego, jest to tylko argument czasu kompilacji. Jeśli metoda akceptuje IEnumerable, nameof po prostu zwraca „IEnumerable”, podczas gdy rzeczywistym obiektem może być „List”.źródło
nameof
nie zwraca nazwyType
nameof
nazwęType
zrzutu ekranu z dowodem: prntscr.com/irfk2cType
, to tylko argument czasu kompilacji. Jeśli metoda akceptuje a,IEnumerable
wówczasnameof
po prostu zwraca „IEnumerable”, podczas gdy rzeczywistym obiektem może być „List <łańcuch znaków”. Wydaje się, że nie odpowiada na pytanie PO.najlepszy sposób użycia:
źródło
obj.GetType().BaseType.Name
powraca,"TypeInfo"
co nie jest pożądanym rozwiązaniem, jak się spodziewam.