ตั้งแต่ฉันเขียนบทความ MSDN ที่คุณอ้างถึงฉันคิดว่าฉันต้องตอบคำถามนี้
ครั้งแรกฉันคาดหวังคำถามนี้และนั่นเป็นสาเหตุที่ฉันเขียนโพสต์บล็อกที่แสดงกรณีการใช้งานจริงมากขึ้นหรือน้อยลงสำหรับ ExpandoObject: ไดนามิกใน C # 4.0: แนะนำ ExpandoObjectExpandoObject
ในไม่ช้า ExpandoObject สามารถช่วยคุณสร้างวัตถุลำดับชั้นที่ซับซ้อนได้ ตัวอย่างเช่นสมมติว่าคุณมีพจนานุกรมอยู่ในพจนานุกรม:
Dictionary<String, object> dict = new Dictionary<string, object>();
Dictionary<String, object> address = new Dictionary<string,object>();
dict["Address"] = address;
address["State"] = "WA";
Console.WriteLine(((Dictionary<string,object>)dict["Address"])["State"]);
ยิ่งลึกลงไปคือลำดับชั้น uglier คือรหัส ด้วย ExpandoObject มันจะยังคงสง่างามและสามารถอ่านได้
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
ข้อสองตามที่ชี้แจงแล้ว ExpandoObject ใช้อินเทอร์เฟซ INotifyPropertyChanged ซึ่งให้การควบคุมคุณสมบัติมากกว่าพจนานุกรม
ในที่สุดคุณสามารถเพิ่มกิจกรรมไปยัง ExpandoObject ได้ที่นี่:
class Program
{
static void Main(string[] args)
{
dynamic d = new ExpandoObject();
// Initialize the event to null (meaning no handlers)
d.MyEvent = null;
// Add some handlers
d.MyEvent += new EventHandler(OnMyEvent);
d.MyEvent += new EventHandler(OnMyEvent2);
// Fire the event
EventHandler e = d.MyEvent;
e?.Invoke(d, new EventArgs());
}
static void OnMyEvent(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent fired by: {0}", sender);
}
static void OnMyEvent2(object sender, EventArgs e)
{
Console.WriteLine("OnMyEvent2 fired by: {0}", sender);
}
}
นอกจากนี้โปรดทราบว่าไม่มีสิ่งใดขัดขวางคุณจากการยอมรับการขัดแย้งของเหตุการณ์ในลักษณะที่เปลี่ยนแปลง ในคำอื่น ๆ แทนการใช้EventHandler
คุณสามารถใช้ซึ่งจะทำให้เกิดข้อโต้แย้งที่สองของการจัดการที่จะเป็นEventHandler<dynamic>
dynamic