C # kendi sınıf adını alma


464

Adlı bir sınıf varsa MyProgram, " MyProgram " dize olarak almanın bir yolu var mı?

Yanıtlar:


743

Bunu dene:

this.GetType().Name

36
Statik bir yöntemdeyseniz, geliştirici türün adının ne olduğunu bilir. Sadece kaynak kodunda bir dize olarak yazabilirsiniz.
Eric Lippert

122
@EricLippert: Adı girerseniz, sınıf yeniden adlandırılırsa derleyici onu yakalamaz.
Halvard

12
@Halvard: İlk olarak, statik yöntem geçerli türdeyse, ad isteğe bağlıdır; değişmesinden endişe ediyorsanız, atlayın. İkinci olarak, Visual Studio, tüm örneklerini yeniden adlandıran bir sınıfı yeniden adlandırdığınızda size otomatik olarak akıllı bir etiket verir. Üçüncüsü, bir sınıfı yeniden adlandırıyorsanız, oranlar iyidir, birçok yerde zaten çok fazla değişiklik yapmanız gerekecektir.
Eric Lippert

12
@EricLippert Haklısın. Herhangi yeni sınıf değiştiriliyor olarak Visual Studio veya ReSharper sürümü aynı adı taşıyan dizeleri yakalayacak. Önceki yorumum sadece biraz eski, şimdi işe yaramaz bilgi ...
Halvard

17
@Halvard: ... ve C # 6'da yeni nameofoperatörü kullanabilirsiniz .
Eric Lippert

238

Bunu iyi bir önlem için kusmak istedim. Sanırım @micahtan'ın yayınlanma şekli tercih ediliyor .

typeof(MyProgram).Name

24
Bu aslında daha iyi, çünkü: 1. Statik bağlamda çalışacak 2. Hesaplanan zaman derleme, bu yüzden yansıtma gibi bir maliyeti yok
Gilbert

6
@JimBalter Birden fazla avantajı vardır: 1. Statik bağlam. 2. Tip kısmı her seferinde CLR tarafından yeniden değerlendirilmez - MSIL'e yazılır. 3. Yeni bir "GetType ()" bildiren birinden sizi korur.
Gilbert

11
Devralınan sınıf adını almak istiyorsanız ve bu çağrı üst öğede ise, çalışmaz.
Gh61

10
Bunun dezavantajı, türüne açıkça başvurmak zorunda kalmasıdır, bu da onu daha az yeniden kullanılabilir hale getirir.
cprcrack

20
C # 6.0 veya sonraki sürümlerde yapabilirsiniz nameof(MyProgram).
Owen Johnson

190

C # 6.0 ile nameofoperatörü kullanabilirsiniz :

nameof(MyProgram)

4
Harika şeyler; ayrıca tür üyeleriyle (yöntemler ve özellikler gibi) ve hatta değişkenlerle çalışır - belgelere bakın .
mklement0

127

Micahtan'ın cevabı iyi olmasına rağmen, statik bir yöntemle çalışmaz. Geçerli türün adını almak istiyorsanız, bu her yerde çalışmalıdır:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;

2
Bu durumda benim yöntemimin tercih edildiğini düşünüyorum rağmen güzel yakalamak.
ChaosPandion

5
Bu, sanal olmayan yöntemler için çalışmaz, çünkü yöntemin bildirildiği ve uygulandığı türün adını döndürür (muhtemelen miras zincirinde), kodu gerçekten yürüttüğünüz örneğin somut türünü değil dan.
Charles Bretana

1
Bu artık DNX (Dot Net Execution) çerçevesinde çalışmıyor gibi görünüyor. GetCurrentMethod () yöntemini kaldırdılar ve yalnızca GetMethodFromHandle () 'i bıraktılar.
Astaar

Bu tam olarak bir torun sanal bir fonksiyon denilen kodu yürüten somut sınıfın adını almak için gereken şeydir.
DrFloyd5

15

Referans olarak, başka birinden miras alan bir türünüz varsa,

this.GetType().BaseType.Name

12

Türetilmiş sınıflarda buna ihtiyacınız varsa, bu kodu temel sınıfa koyabilirsiniz:

protected string GetThisClassName() { return this.GetType().Name; }

Ardından, türetilmiş sınıfta ada ulaşabilirsiniz. Türetilmiş sınıf adını döndürür. Tabii ki, yeni "nameof" anahtar kelimesini kullanırken, bu çeşitlilik gibi bir ihtiyaç olmayacaktır.

Ayrıca bunu tanımlayabilirsiniz:

public static class Extension
{
    public static string NameOf(this object o)
    {
        return o.GetType().Name;
    }
}

Ve sonra şöyle kullanın:

public class MyProgram
{
    string thisClassName;

    public MyProgram()
    {
        this.thisClassName = this.NameOf();
    }
}

10

Bunu kullan

Uygulama diyelim Test.exe çalıştıran ve fonksiyonudur fan () içinde form1 [temelde bir sınıf Form1 ], daha sonra kodu, yukarıdaki yanıt altında üretecektir.

string s1 = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name;

Bu geri dönecek.

s1 = "TEST.form1"

işlev adı için:

string s1 = System.Reflection.MethodBase.GetCurrentMethod().Name;

geri dönücek

s1 = foo 

Bunu istisna kullanımda kullanmak istiyorsanız unutmayın:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}

DeclaringType bildirildiğinden [Nullable(2)], boş denetim etkin olduğunda bir uyarı alırsınız.
Martin

@ Martin, lütfen yorumunu açıkla. Anlamıyorum?
NoChance

2

thisgöz ardı edilebilir. Mevcut sınıf adını almak için ihtiyacınız olan tek şey:

GetType().Name

2

Asp.net'in şu anki sınıf adını edinin

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();

1
DeclaringType bildirildiğinden [Nullable(2)], boş denetim etkin olduğunda bir uyarı alırsınız.
Martin
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.