Vì tôi đã viết bài báo MSDN mà bạn đang đề cập, tôi đoán tôi phải trả lời bài này.
Đầu tiên, tôi dự đoán câu hỏi này và đó là lý do tại sao tôi đã viết một bài đăng trên blog cho thấy trường hợp sử dụng thực tế ít nhiều cho ExpandoObject: Dynamic in C # 4.0: Giới thiệu ExpandoObject .
Một thời gian ngắn, ExpandoObject có thể giúp bạn tạo các đối tượng phân cấp phức tạp. Ví dụ: hãy tưởng tượng rằng bạn có một từ điển trong từ điển:
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"]);
Sâu hơn là thứ bậc, xấu hơn là mã. Với ExpandoObject, nó vẫn thanh lịch và dễ đọc.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
Thứ hai, như đã được chỉ ra, ExpandoObject triển khai giao diện INotifyPropertyChanged cho phép bạn kiểm soát nhiều thuộc tính hơn từ điển.
Cuối cùng, bạn có thể thêm các sự kiện vào ExpandoObject như ở đây:
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);
}
}
Ngoài ra, hãy nhớ rằng không có gì ngăn cản bạn chấp nhận các đối số sự kiện theo cách năng động. Nói cách khác, thay vì sử dụng EventHandler
, bạn có thể sử dụng EventHandler<dynamic>
, điều này sẽ gây ra đối số thứ hai của trình xử lý dynamic
.