C # mendapatkan nama kelasnya sendiri

464

Jika saya memiliki kelas yang dipanggil MyProgram, apakah ada cara untuk mengambil " MyProgram " sebagai string?

deltanovember
sumber

Jawaban:

743

Coba ini:

this.GetType().Name
micahtan
sumber
36
Jika Anda menggunakan metode statis maka pengembang tahu apa nama jenisnya. Anda bisa mengetiknya sebagai string dalam kode sumber.
Eric Lippert
122
@EricLippert: Jika Anda mengetikkan nama, kompiler tidak akan menangkapnya jika kelas diubah namanya.
Halvard
12
@Halvard: Pertama, jika metode statis dalam tipe saat ini maka namanya adalah opsional; jika Anda khawatir itu berubah, abaikan saja. Kedua, Visual Studio akan secara otomatis memberi Anda tag cerdas ketika Anda mengubah nama kelas yang mengganti nama semua instance itu. Dan ketiga, jika Anda mengganti nama kelas maka kemungkinan besar Anda harus membuat banyak perubahan di banyak tempat.
Eric Lippert
12
@ EricLippert Anda benar. Setiap versi baru dari Visual Studio atau ReSharper akan menangkap string dengan nama yang sama dengan kelas yang diganti namanya. Komentar saya sebelumnya hanya beberapa pengetahuan lama, sekarang tidak berguna ...
Halvard
17
@Halvard: ... dan di C # 6 Anda dapat menggunakan nameofoperator baru .
Eric Lippert
238

Saya ingin membuang ini untuk ukuran yang baik. Saya pikir cara @micahtan diposting lebih disukai.

typeof(MyProgram).Name
Kekacauan Kekacauan
sumber
24
Ini sebenarnya lebih baik, karena: 1. Ini akan bekerja dalam konteks statis 2. Ini adalah waktu kompilasi yang dihitung, sehingga tidak memerlukan biaya seperti refleksi
Gilbert
6
@ JimBalter Ini memiliki beberapa keunggulan: 1. Konteks statis. 2. Bagian jenis tidak akan dievaluasi kembali oleh CLR setiap kali - itu akan dituliskan kepada MSIL. 3. Ini melindungi Anda dari seseorang yang menyatakan "GetType ()" baru.
Gilbert
11
Jika Anda ingin mendapatkan nama kelas yang diwarisi dan panggilan ini ada di induk maka itu tidak akan berfungsi.
Gh61
10
Ini memiliki kelemahan karena harus merujuk jenis secara eksplisit, yang membuatnya kurang mudah digunakan kembali.
cprcrack
20
Di C # 6.0 atau yang lebih baru bisa Anda lakukan nameof(MyProgram).
Owen Johnson
190

Dengan C # 6.0, Anda dapat menggunakan nameofoperator:

nameof(MyProgram)
Cyanfish
sumber
4
Hal-hal besar; juga bekerja dengan anggota tipe (seperti metode dan properti) dan bahkan variabel - lihat dokumen .
mklement0
127

Meskipun jawaban micahtan itu baik, itu tidak akan bekerja dengan metode statis. Jika Anda ingin mengambil nama jenis saat ini, yang ini harus bekerja di mana saja:

string className = MethodBase.GetCurrentMethod().DeclaringType.Name;
Thomas Levesque
sumber
2
Tangkapan yang bagus, meskipun saya pikir metode saya lebih disukai dalam kasus ini.
ChaosPandion
5
Ini tidak akan bekerja untuk metode non-virtual, karena akan mengembalikan nama tipe metode yang dideklarasikan dan diimplementasikan, (mungkin sampai rantai pewarisan), bukan tipe konkret dari instance Anda benar-benar mengeksekusi kode dari.
Charles Bretana
1
Ini sepertinya tidak berfungsi lagi dalam kerangka DNX (Dot Net Execution). Mereka menghapus metode GetCurrentMethod () dan hanya menyisakan GetMethodFromHandle ().
Astaar
Inilah yang saya butuhkan untuk mendapatkan nama kelas konkret yang saat ini mengeksekusi kode yang dipanggil dari fungsi virtual dalam turunan.
DrFloyd5
15

Untuk referensi, jika Anda memiliki tipe yang mewarisi dari yang lain, Anda juga dapat menggunakan

this.GetType().BaseType.Name
mikeschuld
sumber
12

Jika Anda membutuhkan ini di kelas turunan, Anda bisa meletakkan kode itu di kelas dasar:

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

Kemudian, Anda dapat mencapai nama di kelas turunan. Mengembalikan nama kelas turunan. Tentu saja, ketika menggunakan kata kunci baru "nameof", tidak perlu seperti tindakan varietas ini.

Selain itu Anda dapat mendefinisikan ini:

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

Dan kemudian gunakan seperti ini:

public class MyProgram
{
    string thisClassName;

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

Gunakan ini

Katakanlah Aplikasi Test.exe sedang berjalan dan fungsinya adalah foo () di form1 [pada dasarnya adalah class form1 ], maka kode di atas akan menghasilkan respons di bawah ini.

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

Ini akan kembali.

s1 = "TEST.form1"

untuk nama fungsi:

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

akan kembali

s1 = foo 

Catatan jika Anda ingin menggunakan ini dalam penggunaan pengecualian:

catch (Exception ex)
{

    MessageBox.Show(ex.StackTrace );

}
Harshal Doshi Jain
sumber
DeclaringType dideklarasikan [Nullable(2)]sehingga Anda mendapatkan peringatan saat cek nol aktif.
Martin
@ Martin, tolong jelaskan komentar Anda. Saya tidak mengerti?
NoChance
2

thisdapat dihilangkan. Yang Anda butuhkan untuk mendapatkan nama kelas saat ini adalah:

GetType().Name
Mikael Engver
sumber
2

Dapatkan nama kelas terkini dari Asp.net

string CurrentClass = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name.ToString();
Abbas ali
sumber
1
DeclaringType dideklarasikan [Nullable(2)]sehingga Anda mendapatkan peringatan saat cek nol aktif.
Martin