Apakah C # memiliki properti ekstensi?
Misalnya, dapatkah saya menambahkan properti ekstensi ke yang DateTimeFormatInfo
dipanggil ShortDateLongTimeFormat
yang akan kembali ShortDatePattern + " " + LongTimePattern
?
c#
properties
extension-methods
Svish
sumber
sumber
?
enum
yang dapat memiliki properti dan metode. C #enum
tidak dapat memiliki properti atau metode, tetapi Anda dapat membuat metode ekstensi. Pertanyaan ini bermanfaat bagi saya, dan tidak boleh ditutup.Jawaban:
Untuk saat ini masih belum didukung oleh kompiler Roslyn ...
Sampai sekarang, properti ekstensi tidak dianggap cukup berharga untuk dimasukkan dalam versi standar C # sebelumnya. C # 7 dan C # 8.0 telah melihat ini sebagai juara proposal tetapi belum dirilis, terutama karena bahkan jika sudah ada implementasi, mereka ingin memperbaikinya sejak awal.
Tapi itu akan ...
Ada item anggota ekstensi dalam daftar kerja C # 7 sehingga dapat didukung dalam waktu dekat. Status properti ekstensi saat ini dapat ditemukan di Github di bawah item terkait .
Namun, ada topik yang bahkan lebih menjanjikan yaitu "memperluas segalanya" dengan fokus terutama pada properti dan kelas statis atau bahkan bidang.
Apalagi Anda bisa menggunakan solusi
Seperti yang ditentukan dalam artikel ini , Anda dapat menggunakan
TypeDescriptor
kemampuan untuk melampirkan atribut ke instance objek saat runtime. Namun, itu tidak menggunakan sintaks dari properti standar.Ini sedikit berbeda dari hanya gula sintaksis yang menambahkan kemungkinan untuk mendefinisikan properti yang diperluas seperti
string Data(this MyClass instance)
sebagai alias untuk metode ekstensistring GetData(this MyClass instance)
karena menyimpan data ke dalam kelas.Saya berharap bahwa C # 7 akan memberikan segala fitur ekstensi lengkap (properti dan bidang), namun pada saat itu, hanya waktu yang akan mengatakan.
Dan jangan ragu untuk berkontribusi karena perangkat lunak masa depan akan datang dari komunitas.
Pembaruan: Agustus 2016
Ketika tim dotnet menerbitkan apa yang baru di C # 7.0 dan dari komentar Mads Torgensen :
Tampaknya properti ekstensi dan anggota lainnya, masih merupakan kandidat yang baik untuk disertakan dalam rilis Roslyn di masa depan, tetapi mungkin bukan yang 7.0.
Pembaruan: Mei 2017
Anggota ekstensi telah ditutup sebagai duplikat dari semua masalah ekstensi yang ditutup juga. Diskusi utama sebenarnya tentang Jenis ekstensibilitas dalam arti luas. Fitur ini sekarang dilacak di sini sebagai proposal dan telah dihapus dari 7,0 tonggak sejarah .
Pembaruan: Agustus, 2017 - C # 8.0 fitur yang diusulkan
Meskipun masih tetap hanya fitur yang diusulkan , kami sekarang memiliki pandangan yang lebih jelas tentang apa yang akan menjadi sintaksnya. Ingatlah bahwa ini juga akan menjadi sintaks baru untuk metode ekstensi:
Mirip dengan kelas parsial, tetapi dikompilasi sebagai kelas / jenis yang terpisah di majelis yang berbeda. Perhatikan bahwa Anda juga dapat menambahkan anggota dan operator statis dengan cara ini. Seperti disebutkan dalam podcast Mads Torgensen , ekstensi tidak akan memiliki status apa pun (sehingga tidak dapat menambahkan anggota instance pribadi ke kelas) yang berarti Anda tidak akan dapat menambahkan data instance pribadi yang ditautkan ke instance . Alasan yang digunakan untuk itu adalah menyiratkan untuk mengelola kamus internal dan itu bisa sulit (manajemen memori, dll ...). Untuk ini, Anda masih bisa menggunakan
TypeDescriptor
/ConditionalWeakTable
teknik yang dijelaskan sebelumnya dan dengan ekstensi properti, menyembunyikannya di bawah properti yang bagus.Sintaks masih dapat berubah karena menyiratkan masalah ini . Misalnya,
extends
dapat diganti denganfor
yang beberapa mungkin merasa lebih alami dan kurang terkait java.Pembaruan Desember 2018 - Peran, Ekstensi, dan anggota antarmuka statis
Perpanjangan semuanya tidak berhasil mencapai C # 8.0, karena beberapa kelemahan dijelaskan sebagai akhir dari tiket GitHub ini . Jadi, ada eksplorasi untuk meningkatkan desain. Di sini , Mads Torgensen menjelaskan apa peran dan ekstensi dan bagaimana perbedaannya:
Hal ini dapat dilihat pada sepersekian proposal sebelumnya dalam dua kasus penggunaan. The sintaks baru untuk perpanjangan akan seperti ini:
maka Anda akan dapat melakukan ini:
Dan untuk antarmuka statis :
Menambahkan properti ekstensi pada
int
dan memperlakukanint
sebagaiIMonoid<int>
:sumber
Tidak, mereka tidak ada di C # 3.0 dan tidak akan ditambahkan dalam 4.0. Itu ada di daftar fitur yang diinginkan untuk C # sehingga dapat ditambahkan di masa mendatang.
Pada titik ini yang terbaik yang dapat Anda lakukan adalah metode ekstensi gaya GetXXX.
sumber
Tidak, mereka tidak ada.
Saya tahu bahwa tim C # sedang mempertimbangkan mereka pada satu titik (atau setidaknya Eric Lippert) - bersama dengan konstruktor ekstensi dan operator (mereka mungkin membutuhkan waktu untuk menggerakkan kepala Anda, tetapi keren ...) Namun, saya belum tidak melihat bukti bahwa mereka akan menjadi bagian dari C # 4.
EDIT: Mereka tidak muncul di C # 5, dan pada Juli 2014 sepertinya tidak akan berada di C # 6 juga.
Eric Lippert , Pengembang Utama pada tim penyusun C # di Microsoft melalui November 2012, membuat blog tentang ini pada Oktober 2009:
sumber
()
pada akhirnya jauh lebih mudah dibaca. Saya tahu secara pribadi, setidaknya 90% dari ekstensi yang saya tulis adalah dari 2 jenis itu.FullName
=FirstName + LastName
,ShortName
=FirstName + LastName[0]
. Saya ingin menambahkan lebih banyak properti ini, tetapi saya tidak ingin "mengotori" kelas sebenarnya. Dalam hal ini properti ekstensi, yang hanya baca, sangat sempurna karena saya dapat menambahkan fungsionalitas, menjaga kelas utama tetap bersih, dan masih mengekspos informasi yang ingin saya paparkan di UI.static implicit operator FileInfo(FileInfoEx fex)
yang mengembalikan objek FileInfo saya yang terkandung. Ini secara efektif memungkinkan saya memperlakukan FileInfoEx seolah-olah mewarisi dari FileInfo, meskipun kelas itu disegel.Pembaruan (terima kasih kepada @chaost untuk menunjukkan pembaruan ini):
Sumber: bagian komentar di https://blogs.msdn.microsoft.com/dotnet/2018/11/12/building-c-8-0/
Saya berhenti menghitung berapa kali selama bertahun-tahun saya membuka pertanyaan ini dengan harapan telah melihat ini diterapkan.
Yah, akhirnya kita semua bisa bersukacita! Microsoft akan memperkenalkan ini dalam rilis C # 8 mendatang.
Jadi alih-alih melakukan ini ...
Kami akhirnya akan bisa melakukannya seperti ...
Sumber: https://blog.ndepend.com/c-8-0-features-glimpse-future/
sumber
Seperti @Psyonity disebutkan, Anda bisa menggunakan conditionalWeakTable untuk menambahkan properti ke objek yang ada. Dikombinasikan dengan ExpandoObject dinamis, Anda dapat menerapkan properti ekstensi dinamis dalam beberapa baris:
Contoh penggunaan ada di komentar xml:
sumber
Karena saya baru-baru ini membutuhkan ini, saya melihat sumber jawabannya di:
c # memperpanjang kelas dengan menambahkan properti
dan membuat versi yang lebih dinamis:
Ini mungkin dapat ditingkatkan banyak (penamaan, dinamis, bukan string), saya saat ini menggunakan ini di CF 3.5 bersama-sama dengan ConditionalWeakTable hacky ( https://gist.github.com/Jan-WillemdeBruyn/db79dd6fdef7b9845e217958db98c4d4 )
sumber