Saya memiliki kelas yang terlihat seperti ini:
public class Field
{
public string FieldName;
public string FieldType;
}
Dan objek List<Field>
dengan nilai:
{"EmployeeID","int"},
{"EmployeeName","String"},
{"Designation","String"}
Saya ingin membuat kelas yang terlihat seperti ini:
Class DynamicClass
{
int EmployeeID,
String EmployeeName,
String Designation
}
Apakah ada cara untuk melakukan ini?
Saya ingin ini dihasilkan saat runtime. Saya tidak ingin file CS fisik berada di sistem file saya.
c#
.net
reflection.emit
dynamic-class-creation
ashwnacharya
sumber
sumber
System.ServiceModel.ChannelFactory<MyDynamicInterface>
Jawaban:
Ya, Anda bisa menggunakan
System.Reflection.Emit
namespace untuk ini. Ini tidak lurus ke depan jika Anda tidak memiliki pengalaman dengan itu, tetapi tentu saja mungkin.Sunting: Kode ini mungkin cacat, tetapi itu akan memberi Anda ide umum dan semoga awal yang baik menuju tujuan.
sumber
Ini akan membutuhkan beberapa pekerjaan, tetapi tentu saja bukan tidak mungkin.
Apa yang telah saya lakukan adalah:
Microsoft.CSharp.CSharpCodeProvider
(CompileAssemblyFromSource)Activator.CreateInstance
)Dengan cara ini Anda dapat menangani kode C # yang sudah Anda ketahui, daripada harus memancarkan MSIL.
Tapi ini bekerja paling baik jika kelas Anda mengimplementasikan beberapa antarmuka (atau berasal dari beberapa baseclass), kalau tidak bagaimana kode panggilan (baca: kompiler) untuk mengetahui tentang kelas yang akan dihasilkan saat runtime?
sumber
Anda juga dapat secara dinamis membuat kelas dengan menggunakan DynamicObject .
Saya menyimpan semua bidang kelas dalam kamus
_fields
bersama dengan jenis dan nilainya. Kedua metode adalah untuk bisa mendapatkan atau menetapkan nilai ke beberapa properti. Anda harus menggunakandynamic
kata kunci untuk membuat turunan dari kelas ini.Penggunaan dengan contoh Anda:
Sunting: Dan inilah tampilannya kelas saya
Field
:sumber
dynamic obj = new DynamicClass(fields){EmployeeId=123456;EmployeeName = "John"; Designation = "Tech Lead";}
akan sangat bagus melakukan ini.Saya tahu saya membuka kembali tugas lama ini tetapi dengan c # 4.0 tugas ini benar-benar tidak menyakitkan.
untuk lebih lanjut lihat https://www.oreilly.com/learning/building-c-objects-dynamically
sumber
Saya tidak tahu maksud penggunaan kelas dinamis seperti itu, dan pembuatan kode serta kompilasi run time dapat dilakukan, tetapi perlu upaya. Mungkin Jenis Anonim akan membantu Anda, seperti:
sumber
Field.FieldName
. Harus membuat kode nama-nama bidang mengalahkan tujuan. Jika Anda harus melakukan itu, Anda bisa membuat kelas.Anda ingin melihat CodeDOM . Itu memungkinkan mendefinisikan elemen kode dan mengompilasinya. Mengutip MSDN:
sumber
Berdasarkan jawaban @ danijels, secara dinamis buat kelas di VB.NET:
sumber
Anda juga dapat secara dinamis membuat kelas dengan menggunakan DynamicExpressions .
Karena 'Kamus memiliki inisialisasi yang ringkas dan menangani tabrakan kunci, Anda ingin melakukan sesuatu seperti ini.
Atau Anda mungkin ingin menggunakan konverter JSON untuk membuat objek string serial Anda menjadi sesuatu yang dapat dikelola.
Kemudian gunakan System.Linq.Dynamic;
Sisanya hanya menggunakan System.Reflection.
sumber
Bagi mereka yang ingin membuat properti kelas dinamis saja (yaitu POCO), dan buat daftar kelas ini. Menggunakan kode yang disediakan kemudian, ini akan membuat kelas dinamis dan membuat daftar ini.
Berikut adalah kelas-kelas yang menggunakan kode sebelumnya.
Catatan: Anda juga harus merujuk pustaka Microsoft.CodeAnalysis.CSharp.
sumber
Anda dapat melihat menggunakan modul dan kelas dinamis yang dapat melakukan pekerjaan. Satu-satunya kelemahan adalah tetap dimuat di domain aplikasi. Tetapi dengan versi .NET framework yang digunakan, itu bisa berubah. .NET 4.0 mendukung rakitan dinamis yang dapat ditagih dan karenanya Anda dapat membuat ulang kelas / tipe secara dinamis.
sumber
Wow! Terima kasih atas jawaban itu! Saya menambahkan beberapa fitur untuk itu untuk membuat konverter "datatable to json" yang saya bagikan kepada Anda.
Dan di sub "compileresulttype", saya mengubah itu:
sumber
Anda dapat menggunakan System.Runtime.Remoting.Proxies.RealProxy. Ini akan memungkinkan Anda untuk menggunakan kode "normal" daripada hal-hal jenis perakitan tingkat rendah.
Lihat jawaban RealProxy untuk pertanyaan ini untuk contoh yang baik:
Bagaimana cara mencegat pemanggilan metode dalam C #?
sumber
Runtime Code Generation with JVM and CLR
- Peter SestoftBekerja untuk orang yang benar-benar tertarik dengan jenis pemrograman ini.
Kiat saya untuk Anda adalah bahwa jika Anda mendeklarasikan sesuatu, cobalah untuk menghindari string, jadi jika Anda memiliki Field kelas, lebih baik menggunakan class System.Type untuk menyimpan tipe field daripada string. Dan demi solusi terbaik, alih-alih membuat kelas baru, coba gunakan yang telah dibuat, FiledInfo, bukan penciptaan yang baru.
sumber