2009-09-08 6 views
5

क्या रन टाइम पर तरीकों और गुण गतिशील सुविधाओं का उपयोग कर संलग्न के प्रदर्शन निहितार्थ, this blog post में वर्णित के रूप कर रहे हैं?सी # 4.0 में रनटाइम पर गुणों और विधियों को संलग्न करना?

ExpandoObject का व्यावहारिक उपयोग क्या हैं?

+0

के संभावित डुप्लिकेट [ ExpandoObject के वास्तविक लाभ क्या हैं?] (Http://stackoverflow.com/questions/1653046/what-are-the-true-benefits-of-expandoobject) – nawfal

उत्तर

10

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

प्रदर्शन जाहिर तरीकों/विशिष्टताओं से स्थिर बाध्य पहुँच की तुलना में धीमी होने जा रहा है, लेकिन डीएलआर बहुत चतुर है। मेरी व्यक्तिगत चिंता प्रदर्शन की कमी के रूप में प्रदर्शन नहीं है - एक टाइपो आसानी से आपके कोड को संकुचित किए बिना संकलक के बिना स्क्रू कर सकता है।

मेरा व्यक्तिगत सलाह के लिए एक ही सी # 4 जहां यह एक बहुत ही स्पष्ट लाभ ... जो मैं अपेक्षाकृत दुर्लभ (असुरक्षित कोड) की तरह होने की उम्मीद देता में गतिशील टाइपिंग का उपयोग करें।

ExpandoObject के लिए उपयोग करता है? बहुत से नहीं, आईएमओ - ज्यादातर अन्य गतिशील भाषाओं से बात करते समय।

+0

वाह, यह प्रोटोटाइप-आधारित प्रोग्रामिंग की तरह दिखने लगता है। इसके अलावा, इसका उपयोग [प्रति-असेंबली] बेस क्लास इंजेक्शन अनुकरण करने के लिए किया जा सकता है? –

+3

अपेक्षाकृत दुर्लभ ?! आप महोदय, रूबी प्रोग्रामर नहीं हैं :) –

+3

@ पॉल: दरअसल ... क्योंकि हम रुबी के बजाय सी # के बारे में बात कर रहे हैं। मूल रूप से स्थाई रूप से टाइप की गई भाषा के रूप में, मेरा मानना ​​है कि यह स्थिर और गतिशील टाइपिंग के मिश-मैश में सी # को बदलने के लिए अपेक्षाकृत दुर्लभ होगा। यदि आप गतिशील टाइपिंग का व्यापक रूप से उपयोग करना चाहते हैं, तो IronRuby या IronPython का उपयोग करें ... –

2

ExpandoObject डीएलआर से संबंधित है, और मुख्य रूप से सी # और गतिशील भाषा (शायद आयरनपीथन) के बीच खेलने के लिए संबंधित है; हालांकि, आमतौर पर इस प्रकार की संपत्ति-बैग ऑब्जेक्ट उपयोगी हो सकती है जब आपके प्रकार की स्कीमा केवल रनटाइम पर जानी जाती है, शायद डेटाबेस डेटा/कॉन्फ़िगरेशन डेटा के आधार पर। शायद "आंतरिक मंच" एंटी-पैटर्न का एक उदाहरण है, लेकिन यह रनटाइम पर गुण संलग्न करने के लिए विशिष्ट परिदृश्यों में उपयोगी है। बेशक, विशुद्ध रूप से CLR उपयोग (यानी कोई डीएलआर कॉल) के लिए आप सिर्फ एक इंडेक्सर और शब्दकोश के साथ इस एक बहुत अधिक बस कर सकते हैं:

obj["Name"] = "Fred"; 
string name = (string) obj["Name"]; 

डेटा-बाइंडिंग प्रयोजनों के लिए, यहां तक ​​कि इस के साथ आप पूरा डेटा बाइंडिंग प्राप्त कर सकते हैं ICustomTypeDescriptor या TypeDescriptionProvider के माध्यम से, कस्टम प्रॉपर्टी डिस्क्रिप्टर का उपयोग करना।

या एक सरल उदाहरण के लिए: DataTable पर विचार ... इस भाग तुम यहाँ क्या कर सकते हैं में है (फिर से, स्थिर टाइप कोड में): (अपरीक्षित उदाहरण)

DataTable table = new DataTable(); 
table.Columns.Add("Name", typeof(string)); 
DataRow row = table.Rows.Add("Fred"); 
संबंधित मुद्दे