C # mendapatkan nama kelasnya sendiri


464

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

Jawaban:


743

Coba ini:

this.GetType().Name

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

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)

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;

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

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

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

}

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

2

Dapatkan nama kelas terkini dari Asp.net

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

1
DeclaringType dideklarasikan [Nullable(2)]sehingga Anda mendapatkan peringatan saat cek nol aktif.
Martin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.