2009-09-22 12 views
53

क्या यह निश्चित रूप से इसका उपयोग करने के लिए एक अच्छा अभ्यास है?.NET में प्रतिबिंब का उपयोग क्यों किया जाता है?

प्रतिबिंब की आवश्यकता वाले किसी प्रोजेक्ट में कुछ संभावित स्थितियां क्या हैं?

उत्तर

31

प्रतिबिंब का मुख्य मूल्य यह है कि इसका उपयोग असेंबली, प्रकार और सदस्यों का निरीक्षण करने के लिए किया जा सकता है। यह किसी अज्ञात असेंबली या ऑब्जेक्ट की सामग्री को निर्धारित करने के लिए एक बहुत ही शक्तिशाली टूल है और विभिन्न प्रकार के मामलों में इसका उपयोग किया जा सकता है।

प्रतिबिंब के विरोधियों का कहना है कि यह धीमा है, जो स्थिर कोड निष्पादन की तुलना में सत्य है - हालांकि प्रतिबिंब का उपयोग .NET ढांचे के दौरान किया जाता है, और बशर्ते कि इसका दुरुपयोग नहीं किया जाता है, यह एक बहुत शक्तिशाली उपकरण हो सकता है टूलकिट।

कुछ उपयोगी अनुप्रयोगों: एक विधानसभा

  • स्थान प्रकार जो एक इंटरफेस के अनुरूप, एक आधार/सार वर्ग से प्राप्त की

    • निर्धारण निर्भरता, और विशेषताओं के आधार पर सदस्यों में से खोज

    • (सुगंधित) परीक्षण - यदि आप ऐसी कक्षा पर निर्भर करते हैं जो अवांछनीय है (यानी यह आपको नकली बनाने की अनुमति नहीं देता है) तो आप वर्ग के भीतर नकली मूल्यों को इंजेक्ट करने के लिए प्रतिबिंब का उपयोग कर सकते हैं - यह सुंदर नहीं है, और अनुशंसित नहीं है, लेकिन यह एक बाध्य में एक आसान उपकरण हो सकता है।

    • डिबगिंग - लोड विधानसभाओं, उनके संदर्भ, वर्तमान तरीकों, आदि की एक सूची डंपिंग ...

  • +24

    प्रतिबिंब का उपयोग परीक्षण के लिए शुरू करने और निष्पादित करने के लिए लगभग सभी परीक्षण ढांचे द्वारा किया जाता है ... –

    30

    वहाँ प्रतिबिंब के लिए कई प्रयोग हैं:

    1. एक वस्तु में गुण के माध्यम से बार-बार दोहराना।
    2. रनटाइम पर परिभाषित विधि को आमंत्रित करना।
    3. एक ही नस पर कई अन्य अन्य।

    हालांकि, प्रतिबिंब के मेरे पसंदीदा उपयोगों में से एक गुणों के साथ चिह्नित गुणों को ढूंढना है।

    उदाहरण के लिए, मैंने विशेषताओं को लिखा है जो मेरी कक्षाओं में कौन से गुणों को लुसीन का उपयोग करके अनुक्रमित किया जाना चाहिए। रनटाइम पर, मैं किसी भी वर्ग को देख सकता हूं, और यह पता लगा सकता हूं कि "चिह्नित" गुणों के लिए कक्षा से पूछताछ करके किन क्षेत्रों को अनुक्रमित करने की आवश्यकता है।

    5

    जैसा ऊपर बताया गया है, प्रदर्शन एक हिट लेगा।

    एक और बड़ा फायदा है कि आप गतिशील विधानसभाओं, आदि लोड करते हैं, संपत्ति हेरफेर भले ही आप गुंजाइश क्या बदलने के लिए देखने के लिए नहीं हो सकता है कर सकते हैं

    कारणों का उपयोग करने के लिए इस खूब हो रहा है। यदि आपको आवश्यकता हो तो यहां an introduction है।

    20

    प्रतिबिंब रन-टाइम के दौरान वस्तुओं की जांच करने का एक तरीका है। यदि आपको ऐसा करने की आवश्यकता नहीं है तो आपको इसका उपयोग नहीं करना चाहिए।

    +2

    सुनिश्चित नहीं है कि आप डाउनवॉटेड क्यों हो गए, लेकिन मैंने इसे ठीक किया :) – leppie

    +0

    दरअसल। प्रतिबिंब एक बेहद शक्तिशाली संसाधन है लेकिन यह अपना प्रदर्शन कर्तव्य लेता है, इसलिए इसका उपयोग तब तक नहीं किया जाना चाहिए जब तक कि वास्तव में आवश्यक न हो। – Konamiman

    5

    प्रतिबिंब आमतौर पर आईओसी कंटेनर में उपयोग किया जाता है। मान लीजिए कि आप "कंट्रोलर" शब्द के साथ प्रत्येक कंक्रीट वर्ग को समाप्त करना चाहते हैं। प्रतिबिंब केक का एक टुकड़ा बनाता है।

    मैंने इकाई परीक्षण कक्षाओं के दौरान निजी क्षेत्रों में हेरफेर करने के लिए प्रतिबिंब का भी उपयोग किया है।

    0

    सी से आ ++ और कुछ सरल वर्ग पदानुक्रम की जरूरत है, मैं कह सकता हूँ कि is कीवर्ड अमूल्य है!

    class MenuItem : Item { } 
    
    foreach(Item items in parent.ChildItems) { 
        if (item is MenuItem) { /* handle differently */ } 
    } 
    

    पीएस प्रतिबिंब थोड़ा महंगा नहीं है, बीटीडब्ल्यू?

    +3

    यह प्रतिबिंब नहीं है :) और नहीं, कुछ उपयोग मामलों में केवल कुछ हिस्सों धीमे हैं। – leppie

    +0

    मेरा बुरा, यह प्रकार आत्मनिरीक्षण है। –

    +0

    सी ++ में आत्मनिरीक्षण प्रकार है, और वही काम कर सकता है –

    8

    उदाहरण के लिए आप प्लगइन की एक प्रणाली को लागू करने के लिए प्रतिबिंब का उपयोग कर सकते हैं। आप बस एक फ़ोल्डर में और प्रतिबिंब जांच के माध्यम से सभी डीएलएल की तलाश करते हैं यदि वे एक निश्चित प्लगइन इंटरफेस को लागू करते हैं। यह मुख्य उद्देश्य है जिसके लिए मैंने प्रतिबिंब का उपयोग किया, लेकिन मैंने इसे सामान्य जेन-ब्रू ऑब्जेक्ट सीरियलाइजेशन को लागू करने के लिए भी उपयोग किया, जहां प्रदर्शन सबसे बड़ी चिंता नहीं थी।

    13

    प्रतिबिंब किसी एप्लिकेशन को अपने बारे में जानकारी एकत्र करने और स्वयं पर हेरफेर करने की अनुमति देता है। इसका उपयोग किसी असेंबली में सभी प्रकारों को असेंबली और/या गतिशील रूप से आमंत्रित विधियों को खोजने के लिए किया जा सकता है।

    सिस्टम। प्रतिबिंब: नामस्थान में कक्षाओं और इंटरफेस शामिल हैं जो लोड प्रकार, विधियों और क्षेत्रों के प्रबंधित दृश्य प्रदान करते हैं, गतिशील रूप से बनाने और प्रकारों को जोड़ने की क्षमता के साथ; इस प्रक्रिया को .NET ढांचे में प्रतिबिंब के रूप में जाना जाता है।

    सिस्टम। टाइप: कक्षा .NET प्रतिबिंब कार्यक्षमता के लिए मुख्य श्रेणी है और मेटाडेटा तक पहुंचने का प्राथमिक तरीका है। सिस्टम। टाइप क्लास एक अमूर्त वर्ग है और आम प्रकार प्रणाली (सीएलएस) में एक प्रकार का प्रतिनिधित्व करता है।

    यह प्रकार की घोषणाओं का प्रतिनिधित्व करता है: वर्ग प्रकार, इंटरफ़ेस प्रकार, सरणी प्रकार, मूल्य प्रकार, गणना प्रकार, प्रकार पैरामीटर, जेनेरिक प्रकार परिभाषाएं, और खुले या बंद निर्मित जेनेरिक प्रकार।

    उदाहरण के लिए:

    using System; 
    using System.Reflection; 
    
    static class ReflectionTest 
    { 
        public static int Height; 
        public static int Width; 
        public static int Weight; 
        public static string Name; 
    
        public static void Write() 
        { 
        Type type = typeof(ReflectionTest); // Get type pointer 
        FieldInfo[] fields = type.GetFields(); // Obtain all fields 
        foreach (var field in fields) // Loop through fields 
        { 
         string name = field.Name; // Get string name 
         object temp = field.GetValue(null); // Get value 
         if (temp is int) // See if it is an integer. 
         { 
         int value = (int)temp; 
         Console.Write(name); 
         Console.Write(" (int) = "); 
         Console.WriteLine(value); 
         } 
         else if (temp is string) // See if it is a string. 
         { 
         string value = temp as string; 
         Console.Write(name); 
         Console.Write(" (string) = "); 
         Console.WriteLine(value); 
         } 
        } 
        } 
    } 
    
    class Program 
    { 
        static void Main() 
        { 
        ReflectionTest.Height = 100; // Set value 
        ReflectionTest.Width = 50; // Set value 
        ReflectionTest.Weight = 300; // Set value 
        ReflectionTest.Name = "ShekharShete"; // Set value 
        ReflectionTest.Write(); // Invoke reflection methods 
        } 
    } 
    
    Output 
    
    Height (int) = 100 
    Width (int) = 50 
    Weight (int) = 300 
    Name (string) = ShekharShete 
    
    2

    बहुत उपयोगी XmlSerialization वर्ग प्रतिबिंब पर निर्भर करता है। क्रमबद्धता का उपयोग करने के लिए आपको खुद को प्रतिबिंब से निपटने की ज़रूरत नहीं है, क्रमबद्धता वर्ग स्वयं प्रतिबिंब का आह्वान करते हैं। लेकिन यह आपके कोड को गुणों के साथ टैग करने में मदद करता है जो गाइड करता है कि ऑब्जेक्ट्स को क्रमबद्ध कैसे किया जाता है। क्रमबद्धता वर्ग उन विशेषताओं को पढ़ने के लिए रनटाइम पर प्रतिबिंब का उपयोग करते हैं। अंत में, प्रक्रिया लगभग जादुई प्रतीत होती है, जिसके लिए आवेदन में स्पष्ट कोडिंग की बहुत कम पंक्तियां होती हैं; यह प्रतिबिंब है जो उस सुविधा को संभव बनाता है।

    एक्सएमएलएसरियलाइजेशन स्वयं ही भयानक नहीं है क्योंकि यह किसी एप्लिकेशन से डेटा फ़ाइलों को बनाने का एक बहुत ही सुविधाजनक तरीका है, यह डीबगिंग उद्देश्यों के लिए किसी प्रोग्राम के आंतरिक डेटा मॉडल के मानव पठनीय रिकॉर्ड उत्पन्न करने का एक बहुत आसान माध्यम भी है।

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