c# - ExpandoObject के वास्तविक लाभ क्या हैं?




.net .net-4.0 (7)

ValueTuples के बाद, ExpandoObject क्लास का उपयोग क्या है? ExpandoObject के साथ यह 6 लाइन कोड:

dynamic T = new ExpandoObject();
T.x = 1;
T.y = 2;
T.z = new ExpandoObject();
T.z.a = 3;
T.b= 4;

tuples के साथ एक पंक्ति में लिखा जा सकता है:

var T = (x: 1, y: 2, z: (a: 3, b: 4));

टुपल सिंटैक्स के अलावा आपके पास मजबूत प्रकार की अनुमान और अंतर्दृष्टि समर्थन है

ExpandoObject क्लास .NET 4 में जोड़ा जा रहा है, जिससे आप मनमाने ढंग से रनटाइम पर ऑब्जेक्ट पर गुण सेट कर सकते हैं।

क्या Dictionary<string,object> , या वास्तव में यहां तक ​​कि एक Hashtable का उपयोग करने के लिए इसका कोई लाभ है? जहां तक ​​मैं कह सकता हूं, यह हैश टेबल के अलावा कुछ भी नहीं है जिसे आप थोड़ा अधिक संक्षिप्त वाक्यविन्यास के साथ एक्सेस कर सकते हैं।

उदाहरण के लिए, यह क्यों है:

dynamic obj = new ExpandoObject();
obj.MyInt = 3;
obj.MyString = "Foo";
Console.WriteLine(obj.MyString);

वास्तव में बेहतर, या काफी अलग, से:

var obj = new Dictionary<string, object>();
obj["MyInt"] = 3;
obj["MyString"] = "Foo";

Console.WriteLine(obj["MyString"]);

केवल एक मनमानी शब्दकोश प्रकार का उपयोग करने के बजाय ExpandoObject का उपयोग करके वास्तविक लाभ प्राप्त किए जाते हैं, यह स्पष्ट नहीं होने के अलावा कि आप रनटाइम पर निर्धारित होने वाले प्रकार का उपयोग कर रहे हैं।


आने वाले संरचित डेटा (यानी एक्सएमएल, जेसन) के लिए गतिशील विज्ञापन-प्रकार प्रकार बनाने के लिए ExpandoObject का उपयोग करने के बारे में महान एमएसडीएन लेख से यह उदाहरण है।

हम expandoObject की गतिशील संपत्ति के प्रतिनिधि को भी असाइन कर सकते हैं:

dynamic person = new ExpandoObject();
person.FirstName = "Dino";
person.LastName = "Esposito";

person.GetFullName = (Func<String>)(() => { 
  return String.Format("{0}, {1}", 
    person.LastName, person.FirstName); 
});

var name = person.GetFullName();
Console.WriteLine(name);

इस प्रकार यह हमें रनटाइम पर गतिशील वस्तु में कुछ तर्क लगाने की अनुमति देता है। इसलिए, लैम्ब्डा एक्सप्रेशन, क्लोजर, डायनामिक कीवर्ड और डायनामिक ऑब्जेक्ट क्लास के साथ , हम अपने सी # कोड में कार्यात्मक प्रोग्रामिंग के कुछ तत्व पेश कर सकते हैं, जिसे हम गतिशील भाषाओं से जावास्क्रिप्ट या PHP जैसी जानते हैं।


चूंकि मैंने एमएसडीएन लेख लिखा है जिसका आप जिक्र कर रहे हैं, मुझे लगता है कि मुझे इसका उत्तर देना होगा।

सबसे पहले, मैंने इस सवाल का अनुमान लगाया और यही कारण है कि मैंने एक ब्लॉग पोस्ट लिखा था जो ExpandoObject के लिए कम या ज्यादा वास्तविक उपयोग केस दिखाता है: सी # 4.0 में गतिशील: ExpandoObject का परिचय

संक्षेप में, 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 लागू करता है 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;

       if (e != null)
       {
           e(d, new EventArgs());
       }

       // We could also fire it with...
       //      d.MyEvent(d, new EventArgs());

       // ...if we knew for sure that the event is non-null.
   }

   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);
   }
}

बाध्यकारी परिदृश्यों के लिए एक फायदा है। डेटा ग्रिड और प्रॉपर्टी ग्रिड टाइपडिस्क्रिप्टर सिस्टम के माध्यम से गतिशील गुणों को उठाएंगे। इसके अलावा, डब्ल्यूपीएफ डेटा बाध्यकारी गतिशील गुणों को समझ जाएगा, इसलिए डब्ल्यूपीएफ नियंत्रण एक शब्दकोश से अधिक आसानी से ExpandoObject से जुड़ सकते हैं।

गतिशील भाषाओं के साथ अंतःक्रियाशीलता, जो शब्दकोश प्रविष्टियों के बजाय डीएलआर गुणों की अपेक्षा की जाएगी, कुछ परिदृश्यों में भी विचार किया जा सकता है।


मेरे लिए असली लाभ एक्सएएमएल से पूरी तरह से सहज डेटा बाध्यकारी है:

public dynamic SomeData { get; set; }

...

SomeData.WhatEver = "Yo Man!";

...

 <TextBlock Text="{Binding SomeData.WhatEver}" />

यह प्रोग्रामर सुविधा के बारे में सब कुछ है। मैं इस वस्तु के साथ त्वरित और गंदे कार्यक्रम लिखने की कल्पना कर सकता हूं।


var obj = new Dictionary<string, object>;
...
Console.WriteLine(obj["MyString"]);

मुझे लगता है कि केवल काम करता है क्योंकि सब कुछ एक ToString () है, अन्यथा आपको यह जानना होगा कि वह किस प्रकार का था और उस वस्तु को 'ऑब्जेक्ट' डाला।

इनमें से कुछ दूसरों की तुलना में अधिक उपयोगी होते हैं, मैं पूरी तरह से प्रयास करने की कोशिश कर रहा हूं।

  1. संग्रह को एक्सेस करना कहीं अधिक स्वाभाविक हो सकता है, इस मामले में अधिक प्रत्यक्ष डॉट नोटेशन का उपयोग करके प्रभावी रूप से "शब्दकोश" क्या होता है।

  2. ऐसा लगता है जैसे यह वास्तव में एक अच्छा टुपल के रूप में इस्तेमाल किया जा सकता है। आप अभी भी अपने सदस्यों को "आइटम 1", "आइटम 2" आदि कह सकते हैं ... लेकिन अब आपको टुपल के विपरीत, यह भी व्यवहार्य नहीं है। इसमें इंटेलिजेंस समर्थन की कमी की भारी कमी है।

  3. आप "सदस्य नामों के रूप में सदस्य नामों" के साथ असहज हो सकते हैं, जैसा कि शब्दकोश के साथ महसूस होता है, आपको लगता है कि यह "निष्पादित तारों" की तरह भी है, और इससे कोडिंग प्राप्त करने वाले सम्मेलनों का नामकरण हो सकता है, और morphhemes के साथ काम करने से निपटना पड़ सकता है और जब कोड कोशिश कर रहा है तो अक्षरों का उपयोग कैसे करें :- पी

  4. क्या आप एक ExpandoObject स्वयं या उसके सदस्यों के लिए एक मान असाइन कर सकते हैं? गतिशील / गतिशील [] की तुलना करें और इसके विपरीत, जो भी आपकी आवश्यकताओं के अनुरूप सर्वोत्तम उपयोग करें।

  5. मुझे लगता है कि गतिशील / गतिशील [] फ़ोरैच लूप में काम नहीं करता है, आपको var का उपयोग करना होगा, लेकिन संभवतः आप ExpandoObject का उपयोग कर सकते हैं।

  6. आप कक्षा में डेटा सदस्य के रूप में गतिशीलता का उपयोग नहीं कर सकते हैं, शायद क्योंकि यह कम से कम एक कीवर्ड की तरह है, उम्मीद है कि आप ExpandoObject के साथ कर सकते हैं।

  7. मुझे उम्मीद है कि यह एक एक्सपांडो ऑब्जेक्ट "है" बहुत सामान्य चीजों को लेबल करने के लिए उपयोगी हो सकता है, कोड के साथ अलग-अलग प्रकार के आधार पर भिन्नताएं होती हैं जहां बहुत सारी गतिशील सामग्री का उपयोग किया जाता है।

अच्छा हो अगर आप एक साथ कई स्तरों को ड्रिल कर सकते हैं।

var e = new ExpandoObject();
e.position.x = 5;
etc...

सबसे अच्छा संभव उदाहरण नहीं है, अपनी खुद की परियोजनाओं में उपयुक्त के रूप में सुरुचिपूर्ण उपयोग की कल्पना करें।

यह एक शर्म की बात है कि आप इनमें से कुछ को कोड नहीं बना सकते हैं और परिणामों को इंटेलिजेंस पर धक्का दे सकते हैं। मुझे यकीन नहीं है कि यह कैसे काम करेगा।

अच्छा रहें अगर उनके पास मूल्य और सदस्य भी हो।

var fifteen = new ExpandoObject();
fifteen = 15;
fifteen.tens = 1;
fifteen.units = 5;
fifteen.ToString() = "fifteen";
etc...






c#-4.0