วิธีสร้างประเภทไดนามิกหรือวัตถุไดนามิกใน C #


130

มีตัวอย่างเช่นคุณสมบัติViewBagของControllerBaseคลาสและเราสามารถรับ / ตั้งค่าแบบไดนามิกและเพิ่มจำนวนฟิลด์หรือคุณสมบัติเพิ่มเติมใด ๆ ให้กับวัตถุนี้ซึ่งเท่มากฉันต้องการใช้บางอย่างเช่นนั้นนอกเหนือจากแอปพลิเคชัน MVC และControllerคลาสอื่น ๆ ประเภทของแอปพลิเคชัน เมื่อฉันพยายามสร้างวัตถุแบบไดนามิกและตั้งค่าเป็นคุณสมบัติดังนี้:

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

ฉันได้รับRuntimeBinderExceptionข้อความProperty หรือ indexer '<> f__AnonymousType0.A' ไม่สามารถกำหนดได้ - มันอ่านได้ในบรรทัดที่ 2 เท่านั้นนอกจากนี้ฉันขอแนะนำว่ามันไม่ใช่สิ่งที่ฉันกำลังมองหา อาจมีบางคลาสที่อนุญาตให้ฉันทำสิ่งที่ชอบ:

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

ด้วยการเพิ่มและตั้งค่าคุณสมบัติแบบไดนามิก

คำตอบ:


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());

อ่านเพิ่มเติมเกี่ยวกับคลาส ExpandoObjectและสำหรับตัวอย่างเพิ่มเติม: แสดงวัตถุซึ่งสมาชิกสามารถเพิ่มและลบแบบไดนามิกได้ในขณะใช้งาน


3
โปรดให้คะแนนคุณลักษณะนี้ใน Visual Studio UserVoice
orad

33

ฉันเพิ่งมีความต้องการที่จะดำเนินการต่อไปหนึ่งขั้นตอนซึ่งจะทำให้การเพิ่มคุณสมบัติในวัตถุแบบไดนามิกแบบไดนามิกตัวเองขึ้นอยู่กับรายการที่ผู้ใช้กำหนด ตัวอย่างที่นี่และจากเอกสาร ExpandoObject ของ Microsoftไม่ได้ระบุถึงการเพิ่มคุณสมบัติแบบไดนามิก แต่สามารถคาดเดาได้จากวิธีการที่คุณระบุและลบคุณสมบัติ อย่างไรก็ตามฉันคิดว่านี่อาจเป็นประโยชน์กับใครบางคน นี่คือเวอร์ชันที่ง่ายมากของวิธีการเพิ่มคุณสมบัติแบบไดนามิกอย่างแท้จริงไปยัง ExpandoObject (ละเว้นคำหลักและการจัดการอื่น ๆ ):

        // 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 คือสิ่งที่คุณกำลังมองหา

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

คุณสามารถใช้ExpandoObject Classที่อยู่ใน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++; });

ข้อมูลเพิ่มเติมสามารถดูได้ที่ ExpandoObject MSDN




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

หรือมูลค่าเป็นปัจจุบัน

  var data = new { studentId, StudentName };
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.