Dapatkah metode ekstensi diterapkan ke kelas?
Misalnya, perpanjang DateTime untuk menyertakan metode Tomorrow () yang bisa dipanggil seperti:
DateTime.Tomorrow();
Saya tahu saya bisa menggunakan
static DateTime Tomorrow(this Datetime value) { //... }
Atau
public static MyClass {
public static Tomorrow() { //... }
}
untuk mendapatkan hasil yang serupa, tetapi bagaimana cara memperpanjang DateTime sehingga saya dapat menjalankan DateTime.Tomorrow?
sumber
Gunakan metode ekstensi .
Ex:
Pemakaian:
atau
sumber
DateTime.Tomorrow()
sebagai metode ekstensi hanya bekerja pada INSTANCES kelas dan struct kelas. Untuk "memperluas" metode statis pada struktur kelas, ikuti jawaban Andrew atau jawaban Shuggy .Metode ekstensi adalah gula sintaksis untuk membuat metode statis yang parameter pertamanya adalah turunan dari tipe T terlihat seolah-olah merupakan metode turunan pada T.
Dengan demikian, manfaatnya sebagian besar hilang di mana Anda membuat 'metode ekstensi statis' karena mereka akan membingungkan pembaca kode bahkan lebih dari metode ekstensi (karena tampaknya sepenuhnya memenuhi syarat tetapi tidak benar-benar ditentukan di kelas itu) tanpa keuntungan sintaksis (mampu untuk menyambung panggilan dengan gaya fasih dalam Linq misalnya).
Karena Anda harus membawa ekstensi ke dalam ruang lingkup dengan menggunakan, saya berpendapat bahwa itu lebih sederhana dan lebih aman untuk dibuat:
Dan kemudian gunakan ini di kode Anda melalui:
sumber
Jawaban terdekat yang bisa saya dapatkan adalah dengan menambahkan metode ekstensi ke dalam
System.Type
objek. Tidak cantik, tapi tetap menarik.Jika tidak, IMO Andrew dan ShuggyCoUk memiliki implementasi yang lebih baik.
sumber
Type
dapat diganti dengan jenis lain yang dibutuhkan. Saya menggunakannya denganFrom
dan berfungsi dengan sempurna. jadi saya kira jawaban ini umum tetapi benarSaya akan melakukan hal yang sama seperti Kumu
tapi sebut saja seperti ini DateTime (). Tomorrow () baru;
Pikirkan itu membuat lebih banyak dilihat daripada DateTime.Now.Tomorrow ();
sumber
Mereka menyediakan kemampuan untuk memperluas tipe yang ada dengan menambahkan metode baru tanpa modifikasi yang diperlukan pada tipe. Memanggil metode dari objek berjenis diperpanjang dalam aplikasi menggunakan sintaks metode instance dikenal sebagai metode '' memperluas ''. Metode ekstensi bukan anggota instance pada tipe. Poin utama yang perlu diingat adalah bahwa metode ekstensi, yang didefinisikan sebagai metode statis, berada dalam cakupan hanya jika namespace secara eksplisit diimpor ke kode sumber aplikasi Anda melalui perintah using. Meskipun metode ekstensi didefinisikan sebagai metode statis, metode tersebut tetap dipanggil menggunakan sintaks instance.
Lihat contoh lengkapnya di sini http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201
Contoh:
sumber
Saya sedang mencari sesuatu yang serupa - daftar kendala pada kelas yang menyediakan Metode Ekstensi. Tampaknya sulit untuk menemukan daftar yang ringkas jadi begini:
Anda tidak dapat memiliki apa pun yang bersifat pribadi atau dilindungi - bidang, metode, dll.
Ini harus menjadi kelas statis, seperti pada
public static class...
.Hanya metode yang dapat berada di kelas, dan semuanya harus statis publik.
Anda tidak dapat memiliki metode statis konvensional - metode yang tidak menyertakan argumen ini tidak diperbolehkan.
Semua metode harus dimulai:
public static ReturnType MethodName (ClassName ini _this, ...)
Jadi argumen pertama selalu merupakan referensi ini.
Ada masalah implisit yang ditimbulkannya - jika Anda menambahkan metode yang memerlukan kunci apa pun, Anda tidak dapat menyediakannya di tingkat kelas. Biasanya Anda akan memberikan kunci tingkat instance pribadi, tetapi tidak mungkin menambahkan bidang pribadi apa pun, meninggalkan Anda dengan beberapa opsi yang sangat canggung, seperti menyediakannya sebagai statis publik pada beberapa kelas luar, dll. Mendapat tidak pasti. Tanda - tanda bahasa C # memiliki desain yang agak buruk untuk ini .
Solusinya adalah dengan menggunakan kelas Metode Ekstensi Anda hanya sebagai Fasad ke kelas biasa, dan semua metode statis di kelas Ekstensi Anda hanya memanggil kelas yang sebenarnya, mungkin menggunakan Singleton .
sumber
Sayangnya, Anda tidak bisa melakukan itu. Saya yakin itu akan berguna. Lebih alami untuk mengetik:
dari:
Dengan kelas Util, Anda harus memeriksa keberadaan metode statis di dua kelas berbeda, bukan satu.
sumber
Jawaban kami telah kami perbaiki dengan penjelasan detail, sekarang lebih mudah untuk memahami metode ekstensi
Metode ekstensi : Ini adalah mekanisme di mana kita dapat memperluas perilaku kelas yang ada tanpa menggunakan subkelas atau memodifikasi atau mengkompilasi ulang kelas atau struct asli.
Kita dapat memperluas kelas khusus kita, kelas kerangka kerja .net dll.
Metode ekstensi sebenarnya adalah jenis metode statis khusus yang didefinisikan di kelas statis.
Karena
DateTime
kelas sudah diambil di atas dan karenanya kami belum mengambil kelas ini untuk penjelasannya.Berikut contohnya
// Ini adalah kelas Kalkulator yang sudah ada yang hanya memiliki satu metode (Tambah)
sumber