Bagaimana cara membuat enum secara otomatis dan kemudian menggunakan nilainya di C # berdasarkan nilai dalam tabel pencarian database (menggunakan lapisan data perpustakaan perusahaan)?
Misalnya, Jika saya menambahkan nilai pencarian baru di database, saya tidak ingin menambahkan deklarasi nilai enum statis ekstra secara manual dalam kode - saya ingin agar enum tetap sinkron dengan database.
Apakah ada yang seperti ini?
Saya tidak ingin membuat kode yang dihasilkan enum statis (sesuai artikel Proyek Kode Enum Code Generator - Menghasilkan kode enum secara otomatis dari tabel pencarian database ) dan lebih suka itu sepenuhnya otomatis.
Jawaban:
Saya melakukan hal yang persis seperti ini, tetapi Anda perlu melakukan semacam pembuatan kode agar ini berfungsi.
Dalam solusi saya, saya menambahkan proyek "EnumeratedTypes". Ini adalah aplikasi konsol yang mendapatkan semua nilai dari database dan membuat enum darinya. Kemudian itu menyimpan semua enum ke sebuah assembly.
Kode pembuatan enum seperti ini:
Proyek saya yang lain dalam referensi solusi perakitan yang dihasilkan ini. Hasilnya, saya kemudian dapat menggunakan enum dinamis dalam kode, lengkap dengan intellisense.
Kemudian, saya menambahkan acara pasca-pembangunan sehingga setelah proyek "EnumeratedTypes" ini dibuat, ia berjalan sendiri dan menghasilkan file "MyEnums.dll".
Ngomong-ngomong, ada baiknya mengubah urutan build project Anda sehingga "EnumeratedTypes" dibuat terlebih dahulu. Jika tidak, setelah Anda mulai menggunakan .dll yang dihasilkan secara dinamis, Anda tidak akan dapat melakukan build jika .dll pernah terhapus. (Masalah ayam dan telur - proyek Anda yang lain dalam solusi membutuhkan .dll ini untuk dibangun dengan benar, dan Anda tidak dapat membuat .dll sampai Anda membangun solusi Anda ...)
Saya mendapatkan sebagian besar kode di atas dari artikel msdn ini .
Semoga ini membantu!
sumber
Enum harus ditentukan pada waktu kompilasi, Anda tidak dapat menambahkan enum secara dinamis selama run-time - dan mengapa Anda, tidak akan ada gunanya / referensi ke dalamnya dalam kode?
Dari Professional C # 2008:
Jadi, saya tidak yakin Anda dapat menggunakan Enum seperti yang Anda inginkan.
sumber
System.Enum
memiliki beberapa fungsi tambahan). Alih-alih menulis,const int Red=0, Green=1, Blue=3;
Anda menulisenum { Red, Green, Blue }
. Konstanta menurut definisi adalah konstan dan tidak dinamis.Apakah itu harus enum yang sebenarnya? Bagaimana kalau menggunakan a
Dictionary<string,int>
sebagai gantinya?sebagai contoh
sumber
Saya telah melakukan ini dengan template T4 . Sangat mudah untuk menjatuhkan file .tt ke dalam proyek Anda, dan mengatur Visual Studio untuk menjalankan template T4 sebagai langkah pra-bangun.
T4 menghasilkan file .cs, yang berarti Anda dapat meminta database dan membuat enum dalam file .cs dari hasilnya. Dipasang sebagai tugas pra-build, itu akan membuat ulang enum Anda pada setiap build, atau Anda dapat menjalankan T4 secara manual sesuai kebutuhan.
sumber
Katakanlah Anda memiliki yang berikut ini di DB Anda:
Buat seleksi untuk mendapatkan nilai yang Anda butuhkan:
Buat kode sumber untuk enum dan Anda akan mendapatkan sesuatu seperti:
(jelas ini dibangun dalam semacam loop.)
Kemudian tibalah bagian yang menyenangkan, Mengompilasi enum Anda dan menggunakannya:
Sekarang Anda memiliki tipe yang telah dikompilasi dan siap digunakan.
Untuk mendapatkan nilai enum yang disimpan di DB, Anda dapat menggunakan:
di mana nilai dapat berupa nilai integer (0, 1, dll.) atau teks / kunci enum (Apple, Banana, dll.)
sumber
Hanya menunjukkan jawaban Pandincus dengan kode "dari rak" dan beberapa penjelasan: Anda memerlukan dua solusi untuk contoh ini (saya tahu itu bisa dilakukan melalui satu juga;), biarkan siswa tingkat lanjut mempresentasikannya ...
Jadi inilah DDL SQL untuk tabel:
Jadi, inilah program konsol yang memproduksi dll:
Berikut adalah program Konsol mencetak output (ingat bahwa itu harus mengacu pada dll). Biarkan siswa tingkat lanjut mempresentasikan solusi untuk menggabungkan semuanya dalam satu solusi dengan pembebanan dinamis dan memeriksa apakah sudah ada build dll.
sumber
flagFileExists
jika tidak digunakan di tempat lain dalam aplikasi?Bukankah kita sampai pada ini dari arah yang salah?
Jika data kemungkinan akan berubah sama sekali selama masa rilis yang diterapkan maka enum tidak sesuai, dan Anda perlu menggunakan kamus, hash, atau koleksi dinamis lainnya.
Jika Anda tahu bahwa kumpulan nilai yang mungkin telah diperbaiki selama masa pakai rilis yang diterapkan, maka enum lebih disukai.
Jika Anda harus memiliki sesuatu dalam database Anda yang mereplikasi set enumerasi, mengapa tidak menambahkan langkah penerapan untuk menghapus dan mengisi kembali tabel database dengan set definitif dari nilai enumerasi?
sumber
Saya selalu suka menulis "enum kustom" saya sendiri. Daripada saya memiliki satu kelas yang sedikit lebih kompleks, tetapi saya dapat menggunakannya kembali:
Sekarang saya hanya perlu membuat enum yang ingin saya gunakan:
Akhirnya saya bisa menggunakannya seperti yang saya inginkan:
Dan keluaran saya adalah:
sumber
Anda ingin System.Web.Compilation.BuildProvider
Saya juga meragukan kebijaksanaan melakukan ini, tetapi mungkin ada kasus penggunaan yang baik yang tidak dapat saya pikirkan.
Apa yang Anda cari adalah Build Providers yaitu System.Web.Compilation.BuildProvider
Mereka digunakan dengan sangat efektif oleh SubSonic , Anda dapat mengunduh sumbernya dan melihat bagaimana mereka menggunakannya, Anda tidak memerlukan apa pun yang setengah rumit seperti yang mereka lakukan.
Semoga ini membantu.
sumber
Anda dapat menggunakan CodeSmith untuk menghasilkan sesuatu seperti ini:
http://www.csharping.com/PermaLink,guid,cef1b637-7d37-4691-8e49-138cbf1d51e9.aspx
sumber
Menurut saya tidak ada cara yang baik untuk melakukan apa yang Anda inginkan. Dan jika Anda memikirkannya, saya rasa ini bukan yang Anda inginkan.
Jika Anda memiliki enum dinamis, itu juga berarti Anda harus memberinya makan dengan nilai dinamis saat Anda mereferensikannya. Mungkin dengan banyak keajaiban Anda bisa mencapai semacam IntelliSense yang akan menangani ini dan menghasilkan enum untuk Anda dalam file DLL. Tetapi pertimbangkan jumlah pekerjaan yang akan dilakukan, betapa tidak efektifnya mengakses database untuk mengambil informasi IntelliSense serta mimpi buruk versi yang mengontrol file DLL yang dihasilkan.
Jika Anda benar-benar tidak ingin menambahkan nilai enum secara manual (Anda tetap harus menambahkannya ke database), gunakan alat pembuat kode, misalnya template T4 . Klik kanan + jalankan dan enum Anda secara statis ditentukan dalam kode dan Anda mendapatkan semua keuntungan menggunakan enum.
sumber
Menggunakan enum dinamis itu buruk, bagaimanapun caranya. Anda harus melalui masalah "menduplikasi" data untuk memastikan kode yang jelas dan mudah dipelihara di masa mendatang.
Jika Anda mulai memperkenalkan pustaka yang dibuat secara otomatis, Anda pasti menyebabkan lebih banyak kebingungan bagi pengembang di masa mendatang karena harus meningkatkan kode Anda daripada sekadar membuat kode enum Anda dalam objek kelas yang sesuai.
Contoh lain yang diberikan terdengar bagus dan menarik, tetapi pikirkan tentang overhead pada pemeliharaan kode versus apa yang Anda dapatkan darinya. Juga, apakah nilai-nilai itu akan berubah sesering itu?
sumber
Salah satu cara untuk menyimpan Enum dan membuat daftar nilai Dinamis pada saat yang sama adalah dengan menggunakan Enum yang saat ini Anda miliki dengan Dictionary yang dibuat secara dinamis.
Karena sebagian besar Enum digunakan dalam konteks yang ditentukan untuk digunakan, dan "enum dinamis" akan didukung oleh proses dinamis, Anda dapat membedakan 2.
Langkah pertama adalah membuat tabel / koleksi yang menampung ID dan Referensi untuk Entri Dinamis. Dalam tabel, Anda akan menaikkan otomatis jauh lebih besar daripada nilai Enum terbesar Anda.
Sekarang sampai pada bagian untuk Enum dinamis Anda, saya berasumsi bahwa Anda akan menggunakan Enum untuk membuat satu set kondisi yang menerapkan seperangkat aturan, beberapa dibuat secara dinamis.
sumber
kelas pembangun enum
buat sebuah objek
sumber