जब से मैंने MSDN लेख लिखा है, जिसका आप उल्लेख कर रहे हैं, मुझे लगता है कि मुझे इसका उत्तर देना होगा।
सबसे पहले, मैंने इस प्रश्न की आशंका जताई और इसीलिए मैंने एक ब्लॉग पोस्ट लिखी जिसमें एक्सपेंडीओबजेक्ट के लिए अधिक या कम वास्तविक उपयोग के मामले को दिखाया गया है: C # 4.0 में डायनामिक: एक्सपेंडीओऑबजेक्ट का परिचय ।
शीघ्र ही, 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"]);
गहरा पदानुक्रम है, बदसूरत कोड है। ExpandoObject के साथ यह सुरुचिपूर्ण और पठनीय रहता है।
dynamic expando = new ExpandoObject();
expando.Address = new ExpandoObject();
expando.Address.State = "WA";
Console.WriteLine(expando.Address.State);
दूसरा, जैसा कि यह पहले ही बताया गया था, एक्सपेंडीओबजेक्ट इम्प्लीमेंट्स इनोटिफ़प्रोपर्टी चेंजेड इंटरफ़ेस जो आपको एक शब्दकोश की तुलना में गुणों पर अधिक नियंत्रण देता है।
अंत में, आप यहां दिए गए 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
।