विचार करने के लिए कई परिदृश्य हैं। सबसे पहले, आपको अपनी वस्तु के प्रकार की जांच करने की आवश्यकता है। आप बस इसके लिए GetType () को कॉल कर सकते हैं। यदि प्रकार ID DynamicsicMetaObjectProvider को लागू नहीं करता है, तो आप किसी अन्य ऑब्जेक्ट के लिए प्रतिबिंब का उपयोग कर सकते हैं। कुछ इस तरह:
var propertyInfo = test.GetType().GetProperties();
हालाँकि, ID DynamicsicMetaObjectProvider कार्यान्वयन के लिए, सरल प्रतिबिंब काम नहीं करता है। मूल रूप से, आपको इस ऑब्जेक्ट के बारे में अधिक जानने की आवश्यकता है। यदि यह ExpandoObject है (जो ID DynamicsicMetaObjectProvider कार्यान्वयन में से एक है), तो आप itowlson द्वारा दिए गए उत्तर का उपयोग कर सकते हैं। ExpandoObject अपने गुणों को एक शब्दकोश में संग्रहीत करता है और आप अपनी गतिशील वस्तु को एक शब्दकोश में डाल सकते हैं।
यदि यह डायनामिकऑब्जेक्ट (एक और ID डायनामिक मैटाओबजेक्टप्रूइडर इम्प्लीमेंटेशन) है, तो आपको इस डायनेमिकऑब्जेक्ट को उजागर करने के लिए जो भी तरीके इस्तेमाल करने की जरूरत है। डायनामिकऑब्जेक्ट को वास्तव में कहीं भी इसके गुणों की सूची को "स्टोर" करने की आवश्यकता नहीं है। उदाहरण के लिए, यह ऐसा कुछ कर सकता है (मैं अपने ब्लॉग पोस्ट से एक उदाहरण का पुन: उपयोग कर रहा हूं ):
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".
तो, आपके पास कुछ भी प्रतिबिंबित करने के लिए नहीं है - इस ऑब्जेक्ट में कोई गुण नहीं है, और एक ही समय में सभी वैध संपत्ति नाम काम करेंगे।
मैं ID DynamicsicMetaObjectProvider कार्यान्वयन के लिए कहूंगा, आपको ज्ञात कार्यान्वयन पर फ़िल्टर करने की आवश्यकता है, जहां आप संपत्तियों की एक सूची प्राप्त कर सकते हैं, जैसे कि ExpandoObject, और बाकी के लिए (या एक अपवाद फेंकें)।