2013-05-16 7 views
5

गुण जोड़ें मैं कक्षा में गतिशील रूप से गुण जोड़ना चाहता हूं और उन्हें मान सेट करना चाहता हूं। क्या कोई मुझे सही दिशा में कुछ ट्यूटोरियल या लेखों के लिए इंगित कर सकता है या यहां तक ​​कि एक उदाहरण प्रदान कर सकता है।कक्षा में गतिशील रूप से C#

मेरे पास बेस क्लास है जिसे फ़ोरैच लूप में कहा जाता है। इस कक्षा के अंदर मुझे 30 गुणों को जोड़ने और मूल्यों को सेट करने की आवश्यकता है।

यह वह तरीका है जो कक्षा को कॉल करता है।

foreach (Class name in this.list) 
{ 
    ClassBeingCalled class = new ClassBeingCalled (name); 
    class.Populate(); 
    this.newlist.Add(class); 
} 

अब अंदर वर्ग बुलाया जा रहा है, मैं मक्खी, जो उस वर्ग के "आबाद" विधि में स्थापित किया जाएगा पर 30 या गुण पैदा करने की जरूरत है।

तो जैसा

...

foreach (PropertyToAssign count2 in listofproperties) 
{ 
    string name = "_nameofproperty" + count2.name 
    base.GetType().GetField(name, BindingFlags.NonPublic | 
          BindingFlags.Instance).SetValue(this, count2); 
} 
+1

गतिशील गुण बनाने की कोशिश करने के बजाए 'listofproperties' का उपयोग करने में क्या गलत है? यदि यह गतिशील होना चाहिए http://msdn.microsoft.com/en-us/library/vstudio/dd264741.aspx – pingoo

+0

पर आपका क्या अर्थ है? –

+0

उन चीजों को * अस्तित्व के रूप में * करें? यानी आप * नई * गुण बनाने की कोशिश कर रहे हैं? या मौजूदा गुणों को मान असाइन करें? –

उत्तर

4

इस दृष्टिकोण के कुछ तरीके हैं।

ए) आप जो कुछ भी चाहते हैं उसके साथ रनटाइम पर कक्षा उत्पन्न करने के लिए प्रतिबिंब का उपयोग करते हैं। आप इस जेनरेट क्लास को बेस क्लास से हमेशा प्राप्त कर सकते हैं जिसमें Populate है लेकिन मुझे आवश्यकता दिखाई नहीं दे रही है।

बी) यदि आप सी # 4.0+ का उपयोग कर रहे हैं, तो आप ExpandoObject का उपयोग कर सकते हैं, जो आपको अपनी आवश्यकताओं के लिए जो भी गुण चाहते हैं उसे सेट करने की अनुमति देता है। ध्यान दें कि ये गुण प्रति के रूप में जोड़े गए हैं, क्योंकि यह DLR का उपयोग करता है जो सभी रनटाइम-आधारित है। आपकी जरूरतों के आधार पर, यह ठीक हो सकता है; यह दृष्टिकोण सी के समान ही है, लेकिन डीएलआर का उपयोग करना।

ग) आप एक समर्थन शब्दकोश का उपयोग और इतने की तरह एक indexer उपयोग करते हैं, कर सकते हैं:

private Dictionary<string, object> _internalData = new Dictionary<string, object>(); 

public T this[string propName] 
{ 
    get { 
     return _internalData[propName]; 
    } 
    set { 
     _internalData[propName] = value; 
    } 
} 

दृष्टिकोण 3 का उपयोग करके, आप वास्तव में string रों जो शायद बेहतर अपनी आवश्यकताओं पर आधारित है के आधार पर अनुक्रमण कर रहे हैं। .. तो आप इस की तर्ज पर कुछ कर सकते हैं के रूप में:

foreach (PropertyToAssign count2 in listofproperties) 
{ 
    string name = "_nameofproperty" + count2.name; 
    this[name] = count2.value; 
} 

दिन के अंत में, यह शायद सबसे अच्छा है अगर आप समस्या you'r समझाने ई हल करने की कोशिश कर रहा है, क्योंकि इसे पूरी तरह से संपर्क करने का एक बेहतर तरीका हो सकता है।

+0

को दर्शाता है मैंने सोचा कि मैंने ऊपर किया है :-(आपको अन्य जानकारी की क्या आवश्यकता है? –

+0

आपने कक्षा में गुणों को सेट करने के पहले से मौजूद समाधान का सुझाव दिया है और हमें बताया कि आपको गुण जोड़ने की जरूरत है। हकीकत में आपको शायद यहां विकल्प सी को देखना चाहिए (इस प्रश्न में अन्य लोगों द्वारा भी सुझाया गया है) और संपत्ति को सेट करने के बजाय, केवल आंतरिक शब्दकोश पर मूल्य निर्धारित करें। –

+0

मैं कैसे शब्दकोश में संपत्ति के प्रकार को परिभाषित करें? –

1

फ्लाई पर संकलित कक्षा में गतिशील गुण जोड़ना संभव नहीं है। आप केवल जबकि मक्खी का उपयोग कर Reflection.Emit

आपका दूसरा विकल्प एक शब्दकोश या ExpandoObject (जो वास्तव में एक शब्दकोश है) का उपयोग किया जा सकता है पर कक्षा में ही निर्माण वर्गों के लिए गतिशील गुण जोड़ सकते हैं। लेकिन इस विकल्प के लिए, आप प्रतिबिंब का उपयोग करके अपने गतिशील गुणों तक नहीं पहुंच सकते हैं।

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