Ponieważ napisałem artykuł MSDN, o którym mówisz, chyba muszę na to odpowiedzieć.
Po pierwsze, przewidziałem to pytanie i dlatego napisałem post na blogu, który pokazuje mniej lub bardziej rzeczywisty przypadek użycia ExpandoObject: Dynamic w C # 4.0: Przedstawiamy ExpandoObject .
Krótko mówiąc, ExpandoObject może pomóc w tworzeniu złożonych obiektów hierarchicznych. Na przykład wyobraź sobie, że masz słownik w słowniku:
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"]);
Im głębsza jest hierarchia, tym bardziej brzydki jest kod. Dzięki ExpandoObject pozostaje elegancki i czytelny.
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
Po drugie, jak już wspomniano, ExpandoObject implementuje interfejs INotifyPropertyChanged, który daje większą kontrolę nad właściwościami niż słownik.
Na koniec możesz dodać zdarzenia do ExpandoObject jak tutaj:
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);
}
}
Pamiętaj też, że nic nie stoi na przeszkodzie, aby przyjmować argumenty zdarzeń w sposób dynamiczny. Innymi słowy, zamiast używać EventHandler
możesz użyć, EventHandler<dynamic>
co spowodowałoby, że byłby to drugi argument programu obsługi dynamic
.