Dalam metode non-statis saya dapat menggunakan this.GetType()
dan itu akan mengembalikan Type
. Bagaimana saya bisa mendapatkan yang sama Type
dalam metode statis? Tentu saja, saya tidak bisa hanya menulis typeof(ThisTypeName)
karena ThisTypeName
hanya diketahui dalam runtime. Terima kasih!
c#
.net
types
static-methods
Yegor
sumber
sumber
Jawaban:
Jika Anda mencari 1 liner yang setara dengan
this.GetType()
metode statis, coba yang berikut ini.Meskipun ini sepertinya jauh lebih mahal daripada hanya menggunakan
typeof(TheTypeName)
.sumber
typeof(TheTypeName)
.Ada sesuatu yang jawaban lain belum cukup klarifikasi, dan yang relevan dengan ide Anda tentang jenis yang hanya tersedia pada waktu eksekusi.
Jika Anda menggunakan tipe turunan untuk mengeksekusi anggota statis, nama tipe sebenarnya dihilangkan dalam biner. Jadi misalnya, kompilasi kode ini:
Sekarang gunakan ildasm di atasnya ... Anda akan melihat bahwa panggilan dibunyikan seperti ini:
Kompilator telah menyelesaikan panggilan ke
Encoding.GetEncoding
- tidak ada jejakUnicodeEncoding
kiri. Itu membuat gagasan Anda tentang "tipe saat ini" tidak masuk akal, saya khawatir.sumber
Solusi lain adalah dengan menggunakan jenis referensi sendiri
Kemudian di kelas yang mewarisinya, saya membuat tipe referensi mandiri:
Sekarang jenis panggilan typeof (TSelfReferenceType) di dalam Parent akan mendapatkan dan mengembalikan Jenis pemanggil tanpa memerlukan instance.
-Rampok
sumber
Anda tidak dapat menggunakan
this
metode statis, jadi itu tidak mungkin dilakukan secara langsung. Namun, jika Anda memerlukan tipe dari beberapa objek, panggil saja objekGetType
tersebut dan jadikanthis
instance sebagai parameter yang harus Anda teruskan, misalnya:Ini sepertinya desain yang buruk. Apakah Anda yakin bahwa Anda benar-benar perlu mendapatkan jenis instance itu sendiri di dalam metode statisnya sendiri? Sepertinya itu agak aneh. Mengapa tidak menggunakan metode contoh saja?
sumber
Saya tidak mengerti mengapa Anda tidak dapat menggunakan typeof (ThisTypeName). Jika ini adalah tipe non-generik, maka ini akan bekerja:
Jika itu adalah tipe generik, maka:
Apakah saya melewatkan sesuatu yang jelas di sini?
sumber
Ketika anggota Anda statis, Anda akan selalu tahu jenisnya bagian dari saat runtime. Pada kasus ini:
Anda tidak dapat memanggil (edit: ternyata, Anda bisa, lihat komentar di bawah, tetapi Anda masih akan memanggil ke A):
karena anggotanya statis, ia tidak berperan dalam skenario warisan. Ergo, Anda selalu tahu bahwa tipenya adalah A.
sumber
Untuk tujuan saya, saya suka ide @ T-moty. Meskipun saya telah menggunakan informasi "tipe referensi sendiri" selama bertahun-tahun, merujuk kelas dasar lebih sulit dilakukan nanti.
Misalnya (menggunakan contoh @Rob Leclerc dari atas):
Bekerja dengan pola ini dapat menjadi tantangan, misalnya; bagaimana Anda mengembalikan kelas dasar dari pemanggilan fungsi?
Atau saat mengetik casting?
Jadi, saya mencoba menghindarinya saat saya bisa, dan menggunakannya saat harus. Jika Anda harus, saya sarankan Anda mengikuti pola ini:
Sekarang Anda dapat (lebih) mudah bekerja dengan file
BaseClass
. Namun, ada kalanya, seperti situasi saya saat ini, di mana mengekspos kelas turunan, dari dalam kelas dasar, tidak diperlukan dan menggunakan saran @ M-moty mungkin merupakan pendekatan yang tepat.Namun, penggunaan kode @ M-moty hanya berfungsi selama kelas dasar tidak berisi konstruktor instance apa pun dalam tumpukan panggilan. Sayangnya kelas dasar saya memang menggunakan konstruktor instance.
Oleh karena itu, inilah metode ekstensi saya yang memperhitungkan konstruktor 'instance' kelas dasar:
sumber
EDIT Metode ini hanya akan berfungsi ketika Anda menyebarkan file PDB dengan executable / library, sebagai markmnl ditunjukkan kepada saya.
Jika tidak, akan menjadi masalah besar untuk dideteksi: bekerja dengan baik dalam pengembangan, tapi mungkin tidak dalam produksi.
Metode utilitas, cukup panggil metode saat Anda membutuhkannya, dari setiap tempat kode Anda:
sumber