दिलचस्प पोस्ट
जीएचसीआई में मल्टी-लाइन कमांड एचटीएमएल 5 फॉर्म आवश्यक विशेषता कस्टम सत्यापन संदेश सेट करें? कोनेर एनजी-व्यू / राउटिंग फोनगैप में काम नहीं कर रहा है MVC3.0 में चेकबॉक्स सूची स्ट्रिंग के लिए एक बड़ी टेक्स्ट फ़ाइल खोजने का सस्ता तरीका एंड्रॉइड स्क्रीन निर्देशांक कैसे कार्य करता है? विकिपीडिया इन्फोकॉक्स से जानकारी कैसे निकाली जा सकती है? स्थिर तरीकों बनाम फ़ंक्शंस का प्रदर्शन जावास्क्रिप्ट का उपयोग करते हुए सीएसएस फ़ाइलों को कैसे लोड करें? सी ++ 11 में यूनिवर्सल मेमोअनाइजेशन फंक्शन लिखना सीएसएस में मार्जिन / पैडिंग प्रतिशत हमेशा चौड़ाई के हिसाब से गणना क्यों करते हैं? नोडजे कनेक्ट स्थिर नहीं मिल सकता है बूट समय एंड्रॉइड पर लॉन्च / लॉन्च कैसे करें एंड्रॉइड 5.0 (लॉलीपॉप) में इनकमिंग कॉम को प्रोग्रामैटिक रूप से कैसे उत्तर दिया जा सकता है? क्या चिंताओं को अलग करना है?

मैं गतिशील ऑब्जेक्ट के सदस्यों को कैसे प्रतिबिंबित करूं?

.NET 4 में गतिशील कीवर्ड के साथ घोषित ऑब्जेक्ट से गुणों के एक शब्दकोश और उनके मूल्यों की आवश्यकता है? यह प्रतिबिंब का उपयोग करने लगता है कि यह काम नहीं करेगा

उदाहरण:

dynamic s = new ExpandoObject(); s.Path = "/Home"; s.Name = "Home"; // How do I enumerate the Path and Name properties and get their values? IDictionary<string, object> propertyValues = ??? 

वेब के समाधान से एकत्रित समाधान "मैं गतिशील ऑब्जेक्ट के सदस्यों को कैसे प्रतिबिंबित करूं?"

यदि IDynamicMetaObjectProvider गतिशील सदस्य नाम प्रदान कर सकता है, तो आप उन्हें प्राप्त कर सकते हैं। एपका लाइसेंस प्राप्त पीसीएल लाइब्रेरी डायनेमेटी (जो नूग में पाई जा सकती है) में GetMemberNames कार्यान्वयन देखें, यह ExpandoObject और DynamicObject लिए काम करता है जो कि GetDynamicMemberNames कार्यान्वित GetDynamicMemberNames और किसी भी अन्य IDynamicMetaObjectProvider जो IDynamicMetaObjectProvider क्रियान्वयन के साथ मेटा ऑब्जेक्ट प्रदान करता है, बिना कस्टम परीक्षण के बिना is IDynamicMetaObjectProvider

सदस्य नाम प्राप्त करने के बाद, मूल्य को सही तरीके से प्राप्त करने के लिए यह थोड़ी अधिक काम है, लेकिन इम्प्रोप्टू ऐसा करता है लेकिन यह सिर्फ दिलचस्प बिट्स को इंगित करना और इसे समझना मुश्किल है। यहां दस्तावेज़ीकरण दिया गया है और यह प्रतिबिंब के मुकाबले बराबर या तेज है, हालांकि विस्तार की तलाश में एक शब्दकोश की तुलना में तेज़ी से होने की संभावना नहीं है, लेकिन यह किसी ऑब्जेक्ट, विस्तार, गतिशील या मूल के लिए काम करता है – आप इसे नाम देते हैं।

ExpandoObject के मामले में, ExpandoObject वर्ग वास्तव में IDictionary<string, object> को उसके गुणों के लिए लागू करता है, इसलिए समाधान कास्टिंग के रूप में तुच्छ है:

 IDictionary<string, object> propertyValues = (IDictionary<string, object>)s; 

ध्यान दें कि यह सामान्य गतिशील वस्तुओं के लिए काम नहीं करेगा। इन मामलों में आपको IDynamicMetaObjectProvider के जरिए DLR को छोड़ना होगा।

विचार करने के लिए कई परिदृश्य हैं सबसे पहले, आपको अपने ऑब्जेक्ट के प्रकार की जांच करनी होगी। आप इस के लिए बस GetType () कॉल कर सकते हैं। यदि प्रकार IDynamicMetaObjectProvider को लागू नहीं करता है, तो आप प्रतिबिंब किसी अन्य ऑब्जेक्ट के लिए उसी प्रकार उपयोग कर सकते हैं। कुछ इस तरह:

 var propertyInfo = test.GetType().GetProperties(); 

हालांकि, IDynamicMetaObjectProvider कार्यान्वयन के लिए, सरल प्रतिबिंब कार्य नहीं करता है। असल में, आपको इस ऑब्जेक्ट के बारे में अधिक जानने की आवश्यकता है। यदि यह ExpandoObject है (जो कि IDynamicMetaObjectProvider कार्यान्वयन में से एक है), तो आप इसे इवोलॉसन द्वारा प्रदान किए गए उत्तर का उपयोग कर सकते हैं। ExpandoObject एक शब्दकोश में इसकी संपत्तियों को संग्रहीत करता है और आप केवल अपनी गतिशील ऑब्जेक्ट को एक शब्दकोश में डाल सकते हैं

यदि यह DynamicObject (अन्य IDynamicMetaObjectProvider कार्यान्वयन) है, तो आपको इस डायनेमिकऑब्जेक्ट को प्रदर्शित करने वाले तरीकों का उपयोग करना होगा। DynamicObject को वास्तव में इसके गुणों की सूची को कहीं भी "स्टोर" करने की आवश्यकता नहीं है उदाहरण के लिए, यह ऐसा कुछ कर सकता है (मैं अपने ब्लॉग पोस्ट से एक उदाहरण का पुन: उपयोग कर रहा हूं):

 public class SampleObject : DynamicObject { public override bool TryGetMember(GetMemberBinder binder, out object result) { result = binder.Name; return true; } } 

इस मामले में, जब भी आप किसी संपत्ति (किसी भी नाम के साथ) का उपयोग करने का प्रयास करते हैं, तो ऑब्जेक्ट केवल संपत्ति का नाम स्ट्रिंग के रूप में देता है।

 dynamic obj = new SampleObject(); Console.WriteLine(obj.SampleProperty); //Prints "SampleProperty". 

इसलिए, आपके पास प्रतिबिंबित करने के लिए कुछ भी नहीं है – इस ऑब्जेक्ट में कोई गुण नहीं है, और साथ ही साथ सभी मान्य गुण नाम काम करेंगे।

मैं IDynamicMetaObjectProvider कार्यान्वयन के लिए कहूँगा, आपको ज्ञात कार्यान्वयन पर फ़िल्टर करना होगा जहां आप संपत्तियों की सूची, जैसे ExpandoObject, प्राप्त कर सकते हैं और शेष के लिए (या कोई अपवाद फेंक सकते हैं)

न्यूटोंसाफ्ट जेसन। नेट की आवश्यकता है

थोड़ा देर हो चुकी है, लेकिन मैं इस के साथ आया था। यह आपको केवल चाबी देता है और फिर आप उन लोगों को गतिशील पर उपयोग कर सकते हैं:

 public List<string> GetPropertyKeysForDynamic(dynamic dynamicToGetPropertiesFor) { JObject attributesAsJObject = dynamicToGetPropertiesFor; Dictionary<string, object> values = attributesAsJObject.ToObject<Dictionary<string, object>>(); List<string> toReturn = new List<string>(); foreach (string key in values.Keys) { toReturn.Add(key); } return toReturn; } 

तो आप बस इस तरह से foreach:

 foreach(string propertyName in GetPropertyKeysForDynamic(dynamicToGetPropertiesFor)) { dynamic/object/string propertyValue = dynamicToGetPropertiesFor[propertyName]; // And dynamicToGetPropertiesFor[propertyName] = "Your Value"; // Or an object value } 

मान को स्ट्रिंग या किसी अन्य ऑब्जेक्ट के रूप में प्राप्त करने का विकल्प चुनना, या अन्य गतिशील करें और फिर से लुकअप का उपयोग करें