2013-02-06 45 views
8

मैं एक वर्ग है?मैं सी # में रनटाइम पर कक्षा में गुण कैसे जोड़ सकता हूं?</p> <pre><code>class MyClass { } ... MyClass c = new MyClass(); </code></pre> <p>क्या यह संभव है चलाने के समय पर इस वर्ग के लिए गुण/फ़ील्ड्स जोड़ने के लिए:

(मुझे नहीं पता उनके प्रकार या संकलन समय पर नाम क्या हैं करते हैं और वे एक आम इंटरफ़ेस जो मैं उपयोग कर सकते हैं की जरूरत नहीं है।)

छद्म उदाहरण:

Add property named "Prop1" [type System.Int32] 
Add property named "Prop900" [type System.String] 

मैं पहले से ही this question पढ़ा लेकिन यह इंटरफेस

धन्यवाद का उपयोग करता है अग्रिम में।

+2

और फिर हर जगह प्रतिबिंब के माध्यम से उन्हें एक्सेस करें? एक 'शब्दकोश <स्ट्रिंग, ऑब्जेक्ट>' के बारे में कैसे? –

+0

@ हेनकहोल्टरमैन हां हेनक बाद में मैं उन्हें 'MyClass.GetType() के साथ एक्सेस करता हूं। GetProperties() ' –

+1

इसके लिए आपको किस केस-केस की आवश्यकता है? 'ICustomeTypeDescriptor' के बारे में क्या? – Dennis

उत्तर

24

आप रनटाइम पर नए सदस्यों के साथ मौजूदा कक्षा का विस्तार नहीं कर सकते हैं। हालांकि, आप System.Reflection.Emit का उपयोग कर एक नई कक्षा बना सकते हैं जिसमें मौजूदा वर्ग बेस क्लास के रूप में है।

typeBuilder.SetParent(typeof(MyClass)); 
typeBuilder.DefineProperty("Prop1", ..., typeof(System.Int32), null); 
... 

एक पूर्ण उदाहरण के लिए TypeBuilder.DefineProperty Method (String, PropertyAttributes, Type, Type[]) देखें।

+0

दिलचस्प लग रहा है। मैं एक नज़रिया धन्यवाद होगा। –

+0

मैं इसे करने में सफल रहा हूं। धन्यवाद। (वह रास्ता था)। वास्तविक प्रश्न _answering_ के लिए धन्यवाद। –

+0

अच्छा स्पष्टीकरण, यह मेरे लिए भी काम किया .. –

1

हां, आप इसे प्राप्त करने के लिए ExpandoObject कक्षा का उपयोग कर सकते हैं।

dynamic expando = new ExpandoObject(); 
expando.Prop1 = 10; 
expando.Prop900 = string.Empty; 
+1

यह अंदर शब्दकोश क्रियान्वयन का उपयोग करता है। मुझे गुणों के साथ शुद्ध वर्ग की आवश्यकता है। –

+1

@ रॉयनामिर: क्यों? –

+0

'GetType()। GetProperties()' शायद एक शब्दकोश से कम कुशल है। –

4

मुझे लगता है कि आपने गलत समझा है कि क्या प्रतिबिंब है। प्रतिबिंब आपको आपके द्वारा चलाए जा रहे कोड को बदलने की अनुमति नहीं देता है। यह आपको अपना कोड पढ़ने और उस कोड को चलाने की अनुमति भी दे सकता है।

प्रतिबिंब के साथ। स्वीकार करें कि आप एक पूरी नई असेंबली लिख सकते हैं और फिर इसे स्मृति में लोड कर सकते हैं।

हालांकि आप रनटाइम पर कक्षा नहीं बदल सकते हैं। कल्पना कीजिए, आपके पास एक कक्षा फू है, आप उनमें से एक पूरे समूह को शांत करते हैं, फिर कक्षा को बदलने का फैसला करते हैं।

आपके द्वारा पहले से ही किए गए सभी फ़ूज़ का क्या होना चाहिए?

हालांकि, आप इसे क्या कर सकते हैं प्रतिबिंब का उपयोग करें। एक नई कक्षा बनाने के लिए प्रवेश करें जो फू को विरासत में लाता है, जिसे बार कहा जाता है, और फिर उस वर्ग को जो भी चाहिए उसे जोड़ें।

वैकल्पिक रूप से यदि आप संकलन समय के बाद किसी वर्ग में प्रोग्रामेटिक रूप से संपत्ति जोड़ना चाहते हैं लेकिन रन टाइम से पहले, आप आईएल बुनाई/एओपी देख सकते हैं। मेरा सुझाव है कि PostSharp या Fody देखें यदि आप इसमें रुचि रखते हैं।

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

  • कोई संबंधित समस्या नहीं^_^