मैं तुम्हारे बारे में पता नहीं है, लेकिन मैं अन्य कंपनियों में परियोजनाओं में कोड लिखा है, और अब मैं चाहता हूँ यह जानने के लिए कि मैंने कुछ कैसे किया! इसलिए आमतौर पर उत्तर के लिए वेब खोज करना तेज़ होता है, और यह मुझे यहां लाया।
हालांकि, मेरे कारण अलग हैं। मैं इकाई परीक्षण कर रहा हूं, और परवाह नहीं करता कि शुद्धियों को क्या कहना है, लेकिन यूनिट परीक्षण के लिए सेटअप के हिस्से के रूप में, मैं किसी दिए गए ऑब्जेक्ट के लिए एक निश्चित स्थिति का आह्वान करने की कोशिश कर रहा हूं। लेकिन उस राज्य को आंतरिक रूप से नियंत्रित किया जाना चाहिए। मैं नहीं चाहता कि कुछ अन्य डेवलपर गलती से राज्य के साथ गड़बड़ कर रहे हों, जो सिस्टम पर बहुत अधिक प्रभाव डाल सकता है। तो यह निजी रूप से सेट किया जाना चाहिए! फिर भी आप इस तरह के कुछ परीक्षणों का आविष्कार किए बिना यूनिट का परीक्षण कैसे करते हैं (उम्मीद है) कभी नहीं होगा? ऐसे परिदृश्यों में, मेरा मानना है कि यूनिट परीक्षण के साथ प्रतिबिंब का उपयोग करना उपयोगी है।
विकल्प उन चीज़ों का खुलासा करना है जिन्हें हम उजागर नहीं करना चाहते हैं, इसलिए हम उन्हें यूनिट का परीक्षण कर सकते हैं! हां, मैंने इसे वास्तविक जीवन वातावरण में देखा है, और इसके बारे में सोचने से मुझे अभी भी मेरा सिर हिलाता है।
तो, मुझे आशा है कि नीचे दिया गया कोड उपयोगी हो सकता है।
चिंताओं को अलग करने, वास्तव में, और पठनीयता में सहायता के लिए यहां दो विधियां हैं। प्रतिबिंब अधिकांश डेवलपर्स के लिए सिर-कताई सामग्री है, जो मेरे अनुभव में या तो इससे दूर भागते हैं, या प्लेग की तरह इससे बचते हैं!
private string _getBackingFieldName(string propertyName)
{
return string.Format("<{0}>k__BackingField", propertyName);
}
private FieldInfo _getBackingField(object obj, string propertyName)
{
return obj.GetType().GetField(_getBackingFieldName(propertyName), BindingFlags.Instance | BindingFlags.NonPublic);
}
मैं नहीं जानता कि क्या कोड सम्मेलनों आप के लिए काम करते हैं, लेकिन व्यक्तिगत रूप से, मैं सहायक तरीकों निजी हो सकता है और एक कम मामले पत्र के साथ शुरू करना चाहते। मुझे पढ़ने के दौरान पर्याप्त स्पष्ट नहीं लगता है, इसलिए मुझे पहले अंडरस्कोर भी पसंद है।
बैकिंग फ़ील्ड और उनके स्वचालित नामकरण की चर्चा है। यूनिट परीक्षणों के उद्देश्य के लिए, यदि आप बदल गए हैं या नहीं तो आपको बहुत तेज़ी से पता चलेगा! यह आपके असली कोड या तो केवल विनाशकारी नहीं होगा। इसलिए हम नामों के नामकरण के बारे में सरल धारणाएं कर सकते हैं-जैसा कि मैंने ऊपर दिया है। आप असहमत हो सकते हैं, और यह ठीक है।
अधिक कठिन सहायक _getBackingField
उन प्रतिबिंब प्रकारों में से एक लौटाता है, FieldInfo
। मैंने यहां भी एक धारणा बनाई है, कि आपके पीछे आने वाला बैकिंग फ़ील्ड एक ऑब्जेक्ट से है जो एक उदाहरण है, स्थिर होने के विपरीत। यदि आप चाहें तो पारित होने के लिए आप तर्कों को तोड़ सकते हैं, लेकिन पानी निश्चित रूप से औसत डेवलपर के लिए गड़बड़ कर देगा जो कार्यक्षमता चाहते हैं लेकिन समझ में नहीं।
FieldInfo
एस के बारे में आसान बात यह है कि वे FieldInfo
से मेल खाने वाली वस्तुओं पर फ़ील्ड सेट कर सकते हैं। यह बेहतर एक उदाहरण के साथ समझाया है:
var field = _getBackingField(myObjectToChange, "State");
field.SetValue(myObjectToChange, ObjectState.Active);
इस मामले में, क्षेत्र ObjectState
नामक एक गणन प्रकार का है। निर्दोषों की सुरक्षा के उद्देश्य से नाम परिवर्तित कर दिए गए हैं! तो, दूसरी पंक्ति में, आप देख सकते हैं कि FieldInfo
तक पहुंचकर पहले लौटाया गया था, मैं SetValue
विधि पर कॉल कर सकता हूं, जो आपको लगता है कि पहले से ही आपके ऑब्जेक्ट से संबंधित होना चाहिए, लेकिन नहीं! यह प्रतिबिंब की प्रकृति है- FieldInfo
उस क्षेत्र से अलग करता है जहां से यह आया था, इसलिए आपको यह कहना होगा कि किस उदाहरण के साथ काम करना है (myObjectToChange
) और इस प्रकार, जिस मान को आप चाहते हैं, इस मामले में ObjectState.Active
।
तो एक लंबी कहानी कम करने के लिए, ऑब्जेक्ट उन्मुख प्रोग्रामिंग हमें निजी क्षेत्रों तक पहुंचने जैसी बदसूरत चीजें करने से रोकती है, और बदतर, कोड के डेवलपर का इरादा नहीं होने पर उन्हें बदलना। कौन सा अच्छा है! यही कारण है कि सी # इतना मूल्यवान है, और डेवलपर्स द्वारा पसंद किया जाता है।
हालांकि, माइक्रोसॉफ्ट ने हमें प्रतिबिंब दिया, और इसके माध्यम से, हम एक शक्तिशाली हथियार चलाते हैं। यह बदसूरत, और बहुत धीमी हो सकती है, लेकिन साथ ही, यह एमएसआईएल (माइक्रोसोफ्ट इंटरमीडिएट लैंग्वेज) के आंतरिक कार्यकलापों की अंतर्निहित गहराई का खुलासा करती है -आईएल-और हमें किताब में हर नियम को काफी तोड़ने में सक्षम बनाता है, यह एक अच्छा उदाहरण होने के नाते।
उत्सुक होना !! तुम उसे क्यों चाहते हो? – Azodious
कार्यान्वयन के लिए प्रोग्रामिंग खतरनाक है। – Eranga
आप इसे निजी प्रतिबिंब के साथ एक्सेस कर सकते हैं, लेकिन यह एक बुरा विचार है। – CodesInChaos