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.

Dmytro
sumber

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.

Mario Sannum
sumber
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);
AlienFromCA
sumber
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;
tidak ada
sumber
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

Kishore Kumar
sumber
9
dynamic myDynamic = new { PropertyOne = true, PropertyTwo = false};
smedasn
sumber
7
dynamic MyDynamic = new ExpandoObject();
Davecz
sumber
7
 var data = new { studentId = 1, StudentName = "abc" };  

Atau nilai hadir

  var data = new { studentId, StudentName };
Batu
sumber