2013-12-16 7 views
5

पर वर्ग के सदस्यों/गुणों को गतिशील रूप से बनाएं और सेट करें मैं रनटाइम पर गतिशील रूप से कक्षा के सदस्यों/गुणों को कैसे बना और सेट कर सकता हूं।गतिशील रूप से रनटाइम

रेफरी: http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.trygetmember(v=vs.110).aspx

मैं अपने आवश्यकताओं के अनुरूप विचार को संशोधित करने की कोशिश की, लेकिन यह ऐसा करने में असमर्थ।

मैं का मतलब है मैं Key और Value डेटाबेस से लाने होगा कार्यावधि में वर्ग के सदस्यों स्थापना करने की आवश्यकता रहा हूँ, और मेरी कक्षा में कोई सदस्य नहीं क्रम से पहले परिभाषित के साथ पूरी तरह से गतिशील हो जाएगा, लेकिन उन सभी को रनटाइम के दौरान डेटाबेस से लाई गई है ।

तो यहाँ

मेरे कोड (MSDN से लिया) चला जाता है:

public class DynamicObjDictionary : DynamicObject 
{ 
    // The inner dictionary. 
    Dictionary<string, object> dictionary = new Dictionary<string, object>(); 
    public int Count 
    { 
     get{return dictionary.Count;} 
    } 

public override bool TryGetMember(GetMemberBinder binder, out object result) 
    { 
     string name = binder.Name.ToLower(); 
     return dynDict.TryGetValue(name, out result); 
    } 

    public override bool TrySetMember(SetMemberBinder binder, object value) 
    { 
     dynDict[binder.Name.ToLower()] = value; 
     return true; 
    } 
} 
} 

कोड कि initializes और परिभाषित करता है सदस्यों/वर्ग

dynamic DynObj = new DynamicObjDictionary(); 
     DataSet ds = new DataSet(); 
     ds = GetObjectProperties() // returns dataset having the properties as key and value pair; 
     if (ds.Tables["PropTable"].Rows.Count > 0) 
     { 
      foreach (DataRow dr in ds.Tables["PropTable"].Rows) 
      { 
       string KeyName = dr["KeyName"].ToString(); 
       string ValueName= dr["ValueName"].ToString(); 
       //---I want that in place of fldName the actual value from dr is added to the class - currently it returns DynObj.KeyName only. 
       DynObj.KeyName = ValueName; 
       // Means if current dr["KeyName"].ToString() has "Property1" 
       // And dr["ValueName"].ToString() has "PropertyValue" 
       // The DynObj should be like DynObj.Property1 = "PropertyValue" 
      } 
     } 

और एक और समस्या के गुणों है कि मैं सभी चाहते हैं उपरोक्त प्रारंभिकरण के बाद गुणों को सेट किया जाना चाहिए ताकि मैं उन्हें क्लास ऑब्जेक्ट की तरह एक्सेस कर सकूं जो हार्ड-कोडेड है। वर्तमान कोड केवल अंतिम संपत्ति को रीसेट करता है यानी डेटासेट की अंतिम पंक्ति का मान।

+0

क्यों आप एक ExpandoObject का उपयोग नहीं करते? – MikeSW

+0

यदि आप इसे ऐसा करते हैं, तो आप इन गुणों को बाद में कैसे एक्सेस करेंगे? आपको * KeyName * को जानने की आवश्यकता होगी, लेकिन यदि आप इसे पहले ही जानते हैं, तो आप केवल एक शब्दकोश का उपयोग क्यों नहीं करते? –

+0

आपके सभी मूल्य स्ट्रिंग होंगे? – Ben

उत्तर

7

या तो एक शब्दकोश-आधारित एपीआई जोड़ें, या एक कार्यान्वयन का उपयोग करें जो पहले से ही है। सच कहूं ExpandoObject ठीक काम करेगा, और एक IDictionary<string,object> एपीआई में बनाया गया है।

var obj = new ExpandoObject(); 
DataSet ds = GetObjectProperties() // returns dataset having the properties as key and value pair; 
if (ds.Tables["PropTable"].Rows.Count > 0) 
{ 
    foreach (DataRow dr in ds.Tables["PropTable"].Rows) 
    { 
     string KeyName = dr["KeyName"].ToString(); 
     string ValueName= dr["ValueName"].ToString(); 
     obj[KeyName] = ValueName; 
    } 
} 
dynamic DynObj = obj; 
// ... 
+0

उत्तर और ऊपर दिए गए सुझाव के लिए धन्यवाद। मुझे वास्तव में 'ExpandoObject()' का उपयोग करना था ताकि 'कुंजी-मूल्य' जोड़ी को बनाए रखा जा सके और फिर डेटा को गतिशील के रूप में वापस कर दिया जाए। – Cyberpks

+0

@marc: मैंने आपके कोड की कोशिश की लेकिन यह लाइन त्रुटि obj [KeyName] = ValueName दे रही है; मैं वीएस -2010 का उपयोग कर रहा हूँ। कोई मदद। – Thomas

+1

@ थॉमस आह, यह पूरी तरह से संभव है मैंने लिखा है कि 'फोन पर! इंडेक्सर –

संबंधित मुद्दे