Bagaimana cara membuat tipe dinamis sendiri atau objek dinamis di C #?


130

Di sana, misalnya, properti ViewBagControllerBase kelas dan kita dapat secara dinamis mendapatkan / menetapkan nilai dan menambahkan sejumlah bidang atau properti tambahan ke objek ini, yang keren. Saya ingin menggunakan sesuatu seperti itu, di luar aplikasi MVC dan Controllerkelas di lain jenis aplikasi. Ketika saya mencoba membuat objek dinamis dan mengatur propertinya seperti di bawah ini:

1. dynamic MyDynamic = new { A="a" };
2. MyDynamic.A = "asd";
3. Console.WriteLine(MyDynamic.A);

Saya menerima RuntimeBinderExceptionpesan Properti atau pengindeks '<> f__AnonymousType0.A' tidak dapat ditugaskan - hanya dibaca di baris 2. Juga saya sarankan Ini bukan yang saya cari. Mungkin ada beberapa kelas yang memungkinkan saya melakukan sesuatu seperti:

??? MyDynamic = new ???();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = DateTime.Now;
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

dengan penambahan dinamis dan pengaturan properti.

Jawaban:


279
dynamic MyDynamic = new System.Dynamic.ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.Number = 12;
MyDynamic.MyMethod = new Func<int>(() => 
{ 
    return 55; 
});
Console.WriteLine(MyDynamic.MyMethod());

Baca lebih lanjut tentang kelas ExpandoObject dan untuk lebih banyak sampel: Merupakan objek yang anggotanya dapat ditambahkan dan dihapus secara dinamis pada waktu berjalan.


3
Silakan pilih fitur ini di Visual Studio UserVoice .
orad

33

Baru-baru ini saya perlu mengambil langkah ini lebih jauh, yaitu membuat penambahan properti dalam objek dinamis, dinamis sendiri, berdasarkan entri yang ditentukan pengguna. Contoh di sini, dan dari dokumentasi Microsoft ExpandoObject , tidak secara khusus menangani penambahan properti secara dinamis, tetapi, dapat diperkirakan dari cara Anda menghitung dan menghapus properti. Bagaimanapun, saya pikir ini mungkin bermanfaat bagi seseorang. Berikut ini adalah versi yang sangat disederhanakan tentang cara menambahkan properti yang benar-benar dinamis ke dalam ExpandoObject (mengabaikan kata kunci dan penanganan lainnya):

        // my pretend dataset
        List<string> fields = new List<string>();
        // my 'columns'
        fields.Add("this_thing");
        fields.Add("that_thing");
        fields.Add("the_other");

        dynamic exo = new System.Dynamic.ExpandoObject();

        foreach (string field in fields)
        {
            ((IDictionary<String, Object>)exo).Add(field, field + "_data");
        }

        // output - from Json.Net NuGet package
        textBox1.Text = Newtonsoft.Json.JsonConvert.SerializeObject(exo);

32

ExpandoObject adalah apa yang kamu cari.

dynamic MyDynamic = new ExpandoObject(); // note, the type MUST be dynamic to use dynamic invoking.
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.TheAnswerToLifeTheUniverseAndEverything = 42;

11

Anda bisa menggunakan ExpandoObject Classyang ada di System.Dynamicnamespace.

dynamic MyDynamic = new ExpandoObject();
MyDynamic.A = "A";
MyDynamic.B = "B";
MyDynamic.C = "C";
MyDynamic.SomeProperty = SomeValue
MyDynamic.number = 10;
MyDynamic.Increment = (Action)(() => { MyDynamic.number++; });

Info lebih lanjut dapat ditemukan di ExpandoObject MSDN


9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};


7
 var data = new { studentId = 1, StudentName = "abc" };  

Atau nilai hadir

  var data = new { studentId, StudentName };
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.