डायनामिक रूप से एक ExpandoObject के गुणों को जोड़ना


233

मैं गतिशील रूप से रनटाइम पर एक ExpandoObject के गुणों को जोड़ना चाहूंगा। उदाहरण के लिए एक स्ट्रिंग प्रॉपर्टी कॉल न्यूप्रॉप जोड़ने के लिए मैं कुछ लिखना चाहूंगा

var x = new ExpandoObject();
x.AddProperty("NewProp", System.String);

क्या यह आसानी से संभव है?


जवाबों:


489
dynamic x = new ExpandoObject();
x.NewProp = string.Empty;

वैकल्पिक रूप से:

var x = new ExpandoObject() as IDictionary<string, Object>;
x.Add("NewProp", string.Empty);

32
मुझे कभी भी यह एहसास नहीं हुआ कि एक्सपेंडेओ ID ID को लागू करता है <string, object>। मैंने हमेशा सोचा है कि कास्ट इसे एक शब्दकोश में कॉपी करेगा। हालाँकि, आपकी पोस्ट ने मुझे यह समझा दिया कि यदि आप डिक्शनरी को बदलते हैं, तो आप अंतर्निहित एक्सपेंडीओबजेक्ट को भी बदलते हैं! बहुत बहुत धन्यवाद
डायनालोंन

3
मिल रहा हैError 53 Cannot convert type 'System.Dynamic.ExpandoObject' to 'System.Collections.Generic.IDictionary<string,string>' via a reference conversion, boxing conversion, unboxing conversion, wrapping conversion, or null type conversion
TheVillageIdiot

24
यह IDictionary<string, object>नहीं है IDictionary<string, string>
स्टीफन क्लीयर

3
@ user123456: संपत्ति के नाम हमेशा तार होते हैं; वे गतिशील नहीं हो सकते। यदि "एक गतिशील" है, तो आपका मतलब है "रनटाइम तक ज्ञात नहीं है", तो आपको दूसरे उदाहरण का उपयोग करना होगा। यदि "गतिशील है", तो आप का मतलब है कि संपत्ति का मूल्य गतिशील है, तो यह ठीक है। एक गतिशील मान होना या तो उदाहरण के लिए ठीक काम करता है।
स्टीफन क्लीयर

3
यह ध्यान रखना महत्वपूर्ण है कि जब आप कास्टिंग कर रहे IDictionaryहैं तो आप dynamicचर प्रकार के रूप में उपयोग नहीं करते हैं ।
user3791372


14

यहाँ एक नमूना सहायक वर्ग है जो एक वस्तु को परिवर्तित करता है और दिए गए ऑब्जेक्ट के सभी सार्वजनिक गुणों के साथ एक विस्तारक देता है।


    public static class dynamicHelper
        {
            public static ExpandoObject convertToExpando(object obj)
            {
                //Get Properties Using Reflections
                BindingFlags flags = BindingFlags.Public | BindingFlags.Instance;
                PropertyInfo[] properties = obj.GetType().GetProperties(flags);

                //Add Them to a new Expando
                ExpandoObject expando = new ExpandoObject();
                foreach (PropertyInfo property in properties)
                {
                    AddProperty(expando, property.Name, property.GetValue(obj));
                }

                return expando;
            }

            public static void AddProperty(ExpandoObject expando, string propertyName, object propertyValue)
            {
                //Take use of the IDictionary implementation
                var expandoDict = expando as IDictionary;
                if (expandoDict.ContainsKey(propertyName))
                    expandoDict[propertyName] = propertyValue;
                else
                    expandoDict.Add(propertyName, propertyValue);
            }
        }

उपयोग:

//Create Dynamic Object
dynamic expandoObj= dynamicHelper.convertToExpando(myObject);

//Add Custom Properties
dynamicHelper.AddProperty(expandoObj, "dynamicKey", "Some Value");

11
"var ExpandoDict = आईडीपीओ के रूप में विस्तारक;" इस लाइन को "var ExpandoDict = Expando के रूप में IDEDIA <स्ट्रिंग, ऑब्जेक्ट>;" में बदलना होगा।
जोम जॉर्ज

0

मुझे लगता है कि यह एक आदिम मूल्य निर्धारित किए बिना वांछित प्रकार में नई संपत्ति जोड़ता है, जैसे कि जब वर्ग परिभाषा में परिभाषित संपत्ति

var x = new ExpandoObject();
x.NewProp = default(string)

5
हे मुर्तजा! कोड-केवल उत्तर समस्या को हल कर सकते हैं लेकिन वे बहुत अधिक उपयोगी हैं यदि आप बताते हैं कि वे इसे कैसे हल करते हैं। समुदाय को आपके उत्तर को पूरी तरह से समझने के लिए सिद्धांत के साथ-साथ कोड की भी आवश्यकता होती है।
आरबीटी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.