Tam ad alanı olmadan tür adını alın


293

Takip koduna sahibim:

return "[Inserted new " + typeof(T).ToString() + "]";

Fakat

 typeof(T).ToString()

ad alanı dahil tam adı döndürür

Sınıf adını almak için herhangi bir adınız var mı (ad alanı niteleyicileri olmadan)?


7
Bu arada, yazma string1 + anything.ToString() + string2gereksizdir. Derleyici aramayı ToStringotomatik olarak ekler string1 + anything + string2.
Tim Robinson

13
Kulağa sert gelmemesine rağmen, Typeörnekte hangi özelliklerin mevcut olduğunu (geri döndüğü gibi typeof(..)) incelemiş olsaydınız, bunu kendiniz
anlayacağınızdan

Yanıtlar:


530
typeof(T).Name // class name, no namespace
typeof(T).FullName // namespace and class name
typeof(T).Namespace // namespace, no class name

5
Nametür parametrelerini dikkate almaz.
gregsdennis

73
Veya this.GetType().Name, this.GetType().FullNamevb. Örneklerle uğraşıyorsanız.
avenmore

1
Nameayrıca yuvalanmış türleri dikkate almaz!
Warlike Chimpanzee

33

Genel türler için tür parametreleri almak için bunu deneyin:

public static string CSharpName(this Type type)
{
    var sb = new StringBuilder();
    var name = type.Name;
    if (!type.IsGenericType) return name;
    sb.Append(name.Substring(0, name.IndexOf('`')));
    sb.Append("<");
    sb.Append(string.Join(", ", type.GetGenericArguments()
                                    .Select(t => t.CSharpName())));
    sb.Append(">");
    return sb.ToString();
}

Belki (özyineleme nedeniyle) en iyi çözüm değil, ama işe yarıyor. Çıktılar şöyle görünür:

Dictionary<String, Object>

3
Bu, kabul edilebilen genel türleri (örneğin, Sözlük <int?, İnt?>) Doğru bir şekilde dikkate aldığı için kabul edilen cevap olmalıdır.
Otis

+1 kavramı için. Ancak başarısız erken optimizasyondan hoşlanmayın. Her özyinelemeli çağrıda (kullanılmadığında temel durum bile) yeni bir StringBuilderöğe oluşturur , ancak string.Joingeçici ve LINQ lambda'yı yok sayar . Sadece kullanmak StringEğer kadar biliyorum bu bir darboğaz var. / rant
Nigel Touch

1
Nigel, muhtemelen bunun en iyi çözüm olmadığını söylüyor :)
gregsdennis

ShortName daha kısa bir isim :)
Valera



5

C # 6.0'dan (dahil) sonra nameof ifadesini kullanabilirsiniz :

using Stuff = Some.Cool.Functionality  
class C {  
    static int Method1 (string x, int y) {}  
    static int Method1 (string x, string y) {}  
    int Method2 (int z) {}  
    string f<T>() => nameof(T);  
}  

var c = new C()  

nameof(C) -> "C"  
nameof(C.Method1) -> "Method1"   
nameof(C.Method2) -> "Method2"  
nameof(c.Method1) -> "Method1"   
nameof(c.Method2) -> "Method2"  
nameof(z) -> "z" // inside of Method2 ok, inside Method1 is a compiler error  
nameof(Stuff) = "Stuff"  
nameof(T) -> "T" // works inside of method but not in attributes on the method  
nameof(f) -> f  
nameof(f<T>) -> syntax error  
nameof(f<>) -> syntax error  
nameof(Method2()) -> error This expression does not have a name  

Not! nameofaltta yatan nesnenin çalışma zamanı Türünü almazsanız, sadece derleme zamanı argümanıdır. Bir yöntem bir IEnumerable kabul ederse, o zaman nameof basitçe "IEnumerable" döndürür, oysa asıl nesne "List" olabilir.


3
nameofadını geri döndürmezType
Nigel Touch

Ben kontrol ettim @NigelTouch ve nameofadını döndürmek Typekanıtı ile ekran görüntüsü: prntscr.com/irfk2c
Stas Boyarincev

1
Üzgünüm, iyi açıklamadım. Demek istediğim, temeldeki nesnenin çalışma zamanını almıyor Type, sadece derleme zamanı argümanı. Bir yöntem kabul ederse IEnumerableo zaman nameofgerçek nesne olabilir oysa sadece "listesi <string>", "IEnumerable" döndürür. OP'nin sorusuna cevap verdiğini düşünmüyor.
Nigel Touch

-2

Kullanmanın en iyi yolu:

obj.GetType().BaseType.Name

1
Diğer kullanıcılar için daha açık hale getirmek için lütfen cevabınıza biraz açıklama yapın.
Stanislav Mekhonoshin

Bir keresinde "GetType (). Name" buldum sanal bir fonksiyon içinde böyle yazılmıştır. Birisi bana neden obj.GetType (). BaseType.Name olmadığını açıklayabilir mi? Öğreniyorum. Tüm sözdizimi ayrıntılarını değil amacını anlıyorum. Teşekkür ederim.
Diego Orellana

Baz tipinin bununla ne ilgisi var?
johnny 5

Benim Test obj.GetType().BaseType.Namedöner "TypeInfo"beklediğim kadar istenilen çözüm değildir.
Nasenbaer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.