Bahsettiğiniz MSDN makalesini yazdığım için, sanırım buna cevap vermeliyim.
İlk olarak, bu soruyu bekledim ve bu yüzden ExpandoObject: C # 4.0'da Dinamik: ExpandoObject'e Giriş için az çok gerçek bir kullanım durumu gösteren bir blog yazısı yazdım .
Kısaca, ExpandoObject karmaşık hiyerarşik nesneler oluşturmanıza yardımcı olabilir. Örneğin, bir sözlük içinde bir sözlüğünüz olduğunu düşünü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"]);
Daha derin olan hiyerarşi, çirkin koddur. ExpandoObject ile zarif ve okunabilir halde kalır.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
İkincisi, daha önce de belirtildiği gibi, ExpandoObject INotifyPropertyChanged arabirimini uygular, bu da özellikler üzerinde bir sözlükten daha fazla kontrol sağlar.
Son olarak, ExpandoObject'e aşağıdaki gibi etkinlikler ekleyebilirsiniz:
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);
}
}
Ayrıca, hiçbir şeyin etkinlik bağımsız değişkenlerini dinamik bir şekilde kabul etmenizi engellemediğini unutmayın. Başka bir deyişle, kullanmak yerine , işleyicinin ikinci argümanının olmasına neden EventHandler
olacak şekilde kullanabilirsiniz .EventHandler<dynamic>
dynamic