C# रिफ्लेक्शन: प्रॉपर्टी का नाम से मान कैसे पाएं - शुरुआती लोगों के लिए गाइड
\n\nकल्पना कीजिए: आप कोड लिख रहे हैं जहां आपको डायनामिक रूप से, तुरंत, किसी ऑब्जेक्ट की प्रॉपर्टी तक पहुंचना है। इस प्रॉपर्टी का नाम, उदाहरण के लिए, कॉन्फ़िगरेशन फ़ाइल, JSON रिक्वेस्ट से आता है, या उपयोगकर्ता द्वारा दर्ज किया जाता है। object.PropertyName को हार्डकोड नहीं किया जा सकता - आप पहले से नाम नहीं जानते। तो क्या करें?
यहां रिफ्लेक्शन (reflection) काम आता है - C# का एक शक्तिशाली तंत्र जो आपको प्रोग्राम के निष्पादन के दौरान डेटा प्रकारों और उनके सदस्यों (प्रॉपर्टी, मेथड, फील्ड) की जांच करने की अनुमति देता है। इस लेख में, हम Stack Overflow पर सबसे लोकप्रिय प्रश्न को हल करेंगे: किसी ऑब्जेक्ट की प्रॉपर्टी का मान उसके नाम वाली स्ट्रिंग से कैसे प्राप्त करें। हम वास्तविक उदाहरणों के साथ, सरल से जटिल तक, और शुरुआती लोगों द्वारा की जाने वाली सामान्य गलतियों पर भी चर्चा करेंगे।
\n\nरिफ्लेक्शन क्या है और इसकी आवश्यकता क्यों है?
\n\nC# में रिफ्लेक्शन, प्रोग्राम की अपने स्वयं के प्रकारों के बारे में जानकारी प्राप्त करने की क्षमता है। System.Reflection नेमस्पेस Type, PropertyInfo, MethodInfo जैसी क्लासेज प्रदान करता है, जो आपको निम्न की अनुमति देता है:
- \n
- क्लास के सभी प्रॉपर्टी और मेथड के बारे में जानना। \n
newऑपरेटर के बिना क्लास के इंस्टेंस बनाना। \n - मेथड को कॉल करना और प्रॉपर्टी के मानों को उनके स्ट्रिंग नामों से प्राप्त/सेट करना। \n
रिफ्लेक्शन के बिना, आप एक यूनिवर्सल ऑब्जेक्ट मैपर (जैसे AutoMapper) या सीरियलाइज़र नहीं लिख सकते थे जो किसी भी डेटा प्रकार के साथ काम करते हैं।
\n\nबेसिक उदाहरण: प्रॉपर्टी का नाम से मान प्राप्त करना
\n\nमान लीजिए, हमारे पास एक सरल Person क्लास है:
public class Person\n{\n public string Name { get; set; }\n public int Age { get; set; }\n public string City { get; set; }\n}\n\nहम एक मेथड लिखना चाहते हैं जो Person ऑब्जेक्ट और प्रॉपर्टी के नाम वाली स्ट्रिंग (जैसे, "Name" या "Age") लेता है और उस प्रॉपर्टी का मान लौटाता है। रिफ्लेक्शन का उपयोग करके इसे इस प्रकार किया जाता है:
using System;\nusing System.Reflection;\n\npublic static object GetPropertyValue(object obj, string propertyName)\n{\n if (obj == null) throw new ArgumentNullException(nameof(obj));\n if (string.IsNullOrEmpty(propertyName)) throw new ArgumentException("प्रॉपर्टी का नाम खाली नहीं हो सकता", nameof(propertyName));\n\n // ऑब्जेक्ट का प्रकार प्राप्त करें\n Type type = obj.GetType();\n\n // प्रॉपर्टी के नाम से उसकी जानकारी प्राप्त करें\n PropertyInfo propertyInfo = type.GetProperty(propertyName);\n\n // जांचें कि क्या ऐसी प्रॉपर्टी मौजूद है\n if (propertyInfo == null)\n throw new ArgumentException($"प्रॉपर्टी '{propertyName}' टाइप '{type.Name}' में नहीं मिली");\n\n // प्रॉपर्टी का मान प्राप्त करें\n return propertyInfo.GetValue(obj);\n}\n\nअब हम अपने मेथड का उपयोग करते हैं:
\n\nvar person = new Person { Name = "अन्ना", Age = 30, City = "मॉस्को" };\n\nstring name = (string)GetPropertyValue(person, "Name");\nint age = (int)GetPropertyValue(person, "Age");\n\nConsole.WriteLine($"नाम: {name}, उम्र: {age}"); // आउटपुट: नाम: अन्ना, उम्र: 30\n\nसब कुछ काम करता है! मुख्य बिंदु:
\n- \n
obj.GetType()- हमारे ऑब्जेक्ट के प्रकार का वर्णन करने वालाTypeऑब्जेक्ट प्राप्त करता है। \n type.GetProperty("Name")- "Name" नाम की पब्लिक प्रॉपर्टी खोजता है। यहPropertyInfoलौटाता है याnullयदि प्रॉपर्टी नहीं मिलती है। \n propertyInfo.GetValue(obj)- विशिष्ट इंस्टेंसobjके लिए इस प्रॉपर्टी का मान लौटाता है। \n
महत्वपूर्ण बारीकियां और सामान्य गलतियां (जो जूनियर डेवलपर्स अक्सर करते हैं)
\n\n1. केस-सेंसिटिविटी (केस संवेदनशीलता)
\nGetProperty मेथड डिफ़ॉल्ट रूप से केस-सेंसिटिव है। यदि आप "Name" के बजाय "name" निर्दिष्ट करते हैं, तो प्रॉपर्टी नहीं मिलेगी।