गतिशील गुणों की क्वेरी करने के लिए कोई समान तरीका नहीं है, आम तौर पर यह अपेक्षा की जाती है कि आप उन्हें समय से पहले जानते हैं। DynamicObject
के साथ, कार्यान्वयन GetMemberNames
ओवरराइड कर सकते हैं और यह आम तौर पर आपको गुण देता है, हालांकि यह वास्तव में डिबगिंग के लिए है क्योंकि इसकी आवश्यकता नहीं है कि यह सभी गुण प्रदान करे। अन्यथा यदि यह आपका DynamicObject
है तो आपको अपने गतिशील कार्यान्वयन के आधार पर गुण प्राप्त करने के लिए बस अपनी खुद की विधि लिखनी होगी। उदाहरण के लिए ExpandoObject
आपको IDictionary
इंटरफ़ेस का उपयोग करके सभी संपत्तियों से पूछताछ करने देता है।
तो एक बार जब आपके पास अपनी संपत्तियां प्राप्त करने का कोई तरीका हो तो आपको डेटाग्रिड को बताना होगा। दुर्भाग्य से डेटाग्रिड के साथ, डेटाग्रिड को आपके गुणों के बारे में बताने के लिए ICustomTypeDescriptor
को कार्यान्वित करने के साथ समस्या यह है कि डेटाग्रिड टाइप टाइपस्क्रिप्टर्स को टाइप नहीं करता है, जो डायनामिक ऑब्जेक्ट्स की समस्या है, हालांकि डायनेमिक ऑब्जेक्ट्स के संग्रह पर ITypedList
को कार्यान्वित करना होगा यदि आप अपने संग्रह पर गैर-जेनेरिक IList
इंटरफ़ेस को लागू नहीं करते हैं, तो बहुत छोटा गॉचा, इसे उस बिंदु पर पहुंचने से पहले बाहर कर दिया जाएगा जहां यह ITypeList
के लिए जांच करता है।
तो संक्षेप में, ITypedList
और IList
के साथ संग्रह को कार्यान्वित करें। ITypedList
GetListName
के लिए वापसी शून्य के साथ और बस GetItemProperties(PropertyDescriptor[] listAccessors)
लागू करें; listAccessors
को अनदेखा करें और अपनी सूची में सर्वोत्तम प्रतिनिधित्व किए गए डायनामिक ऑब्जेक्ट उदाहरण के आधार पर नामित प्रत्येक सदस्य के लिए PropertyDescriptors का एक PropertyDescriptorCollection लौटाएं (सबसे अधिक संभावना केवल पहली वस्तु)। आप PropertyDescriptor का एक उपवर्ग को लागू करने की क्या ज़रूरत है, प्राप्त/सेट मूल्य के लिए एक आसान और सामान्य तरीके से खुला स्रोत ढांचे Dynamitey
using System;
using System.ComponentModel;
using Dynamitey;
public class DynamicPropertyDescriptor:PropertyDescriptor
{
public DynamicPropertyDescriptor(string name) : base(name, null)
{
}
public override bool CanResetValue(object component)
{
return false;
}
public override object GetValue(object component)
{
return Dynamic.InvokeGet(component, Name);
}
public override void ResetValue(object component)
{
}
public override void SetValue(object component, object value)
{
Dynamic.InvokeSet(component, Name, value);
}
public override bool ShouldSerializeValue(object component)
{
return false;
}
public override Type ComponentType
{
get { return typeof(object); }
}
public override bool IsReadOnly
{
get { return false; }
}
public override Type PropertyType
{
get
{
return typeof (object);
}
}
}
यह Winforms में भी काम करता है। आपका बहुत बहुत धन्यवाद! – swe