C# typeof – Reflection in C#

C# typeof – Reflection in C#: Reflection .NET Framework द्वारा Provided एक ऐसा Feature है, जिसका प्रयोग करके हम Program के Runtime में किसी Type की Information को Access कर सकते हैं।

यानी जब हम C# में किसी Program को .EXE या .DLL File के रूप में Compile करते हैं, तो वह File एक Intermediate Machine Code यानी MSIL में Convert हो जाती है, जिसे केवल .NET Platform यानी CLR समझता है। ये .EXE या .DLL File वास्तव में एक Assembly File होती है, जिसमें METADATA, Compiled Code व Resources से सम्बंधित विभिन्न प्रकार की जानकारियां होती हैं।

Reflection Namespace हमें ऐसे Types Provided करता है, जिनका प्रयोग करके हम हमारे Program के Runtime में किसी Assembly की उन्हीं Intermediate Information को Access कर सकते हैं।

यानी .NET हमें Intermediate Code के रूप में जो Compiled Assembly File Return करता है, उस Assembly File में Local Variables के नाम, Comments व Preprocessor Directives को छोडकर Original Source File का सारा Content होता है।

इसलिए Reflection Types का प्रयोग करके हम इस Compiled Assembly में से Original Source File के Content को Program के Runtime में Retrieve कर सकते हैं। यहां तक कि यदि हम चाहें तो Reflections का प्रयोग करके किसी Compiled Assembly File को पूरी तरह से फिर से Decompile भी कर सकते हैं।

यानी Reflection हमें ऐसी Capability Provide करता है, जिसकी वजह से हम किसी Type की उन Capabilities को Access करने की क्षमता प्राप्त कर लेते हैं, जिनके बारे में केवल .NET Platform का CLR यानी Runtime ही जानता है।

C# Program में .NET Framework की कई Services जैसे कि Dynamic Binding, Serialization, Data BindingRemoting पूरी तरह से Assembly के Metadata पर आधारित होती हैं। जिन्हें हम Reflection द्वारा Provided Features द्वारा Access व Extend कर सकते हैं।

इसी तरह से हमारे स्वयं के Program की भी Assembly File Create होती है, जिसमें हमारे Program से सम्बंधित Metadata Exist होते हैं। Reflections का प्रयोग करके हम हमारे स्वयं के Program की Assembly को भी Current Program में Access व Extend कर सकते हैं।

सामान्‍यत: जब हम C# में कोई Program Create करते हैं, तो हम विभिन्न प्रकार के Data पर विभिन्न प्रकार के Operations Perform करते हैं। हम Data को Read करते हैं, Write करते हैं, Manipulate करते हैं, Display करते हैं। Metadata वे Data होते हैं, जो Current Program के Data नहीं होते बल्कि Current Program में Participate करने वाले विभिन्न Types, Resources, References आदि की Information होते हैं।

यानी जो Data, Current Program व उनकी Classes, Structures, Delegates, आदि से सम्बंधित होते हैं और Program की Assembly में Store होते हैं, उन्हें Metadata कहा जाता है। जबकि किसी Program में Reflections का प्रयोग करके हम इन Metadata को Runtime में Access व Manipulate कर सकते हैं।

यदि हम सरल शब्दों में Metadata को Represent करें, तो जब हम Visual Studio के Object Browser Utility को Use करते हैं, तो ये Object Browser, .NET Framework की विभिन्न Assemblies व उनके विभिन्न Namespaces में Stored Types आदि की जानकारी Provide करता है।

इसलिए Object Browser को हम एक प्रकार का Metadata Utility Program मान सकते हैं, क्योंकि ये स्वयं किसी तरह से किसी Type को Define नहीं कर रहा है बल्कि पहले से Exist Types की Information Return कर रहा है।

सरल शब्दों में कहें तो Runtime में किसी Assembly के Type की Discovery यानी पता लगाने की Process को Reflection कहा जा सकता है। Reflection Services का प्रयोग करके हम Programmatically किसी Assembly के उन्हीं Metadata को Access कर सकते हैं, जिन्हें .NET Platform का CLR Runtime में Access करता है।

उदाहरण के लिए यदि हम चाहें तो Programmatically Current Program में Program के Runtime में किसी .EXE या .DLL Assembly में Use किए गए सभी Types, Fields, Methods, Properties, Events, Delegates आदि की List प्राप्त कर सकते हैं, जिसकी जानकारी सिर्फ .NET Platform के CLR को उस समय होती है, जब वह किसी Assembly को Run कर रहा होता है।

इससे पहले कि हम Reflection को Use करने के सन्दर्भ में थोडा गहराई से समझें, हम पहले एक सरल Concept को समझ लेते हैं, जिसे Runtime Type Identification (RTTI) के नाम से जाना जाता है और इस Concept का सम्बन्ध Reflection से ही है, जिसके बारे में हम आगे विस्तार से जानेंगे।

C# – Runtime Type Identification

Runtime Type Identification एक ऐसी प्रक्रिया है, जिसका प्रयोग करके हम हमारे Program के Runtime में किसी विशेष Situation में किसी Type को Identify करके उस Type के आधार पर किसी Code को Execute करते हैं।

उदाहरण के लिए यदि हम इस बात का पता लगाना चाहते हैं कि Currently जिस Base Class Reference Variable द्वारा कोई Object Refer हो रहा है, वह Object किस Type का है अथवा हम किसी Particular Type के Object के लिए ही जब किसी Code को Execute करना चाहते हैं, तो उस Object के Type को Identify करने के लिए हम Runtime Type Identification को Use करते हैं।

C# में मूल रूप से is, as typeof नाम के तीन Keywords को Include किया गया है, जिनका प्रयोग Runtime Type Identification (RTTI) के लिए किया जाता है।

is Keyword

इस Keyword का प्रयोग करके हम इस बात का पता लगा सकते हैं कि कोई Object किसी Particular Type का है या नहीं। इस Keyword को निम्नानुसार तरीके से Use किया जाता है:

expression is type

जहां expression के रूप में हमें उस Object को Specify करना होता है, जिसे हम Test करना चाहते हैं जबकि type के रूप में हमें उस Type को Specify करना होता है, जिसके Against हम Expression के रूप में Specified Object को Test करना चाहते हैं।

यदि expression के रूप में Specified Object type प्रकार का ही है, तो ये Statement true Return करना है अन्‍यथा false Return करता है। इस Keyword को ठीक से समझने के लिए हम निम्नानुसार एक Program Create कर सकते हैं:

File Name: isKeyword.cs
using System;

class BaseClass { }
class DerivedClass : BaseClass { }

class isKeywordUsing
{
    public static void Main()
    {
        BaseClass baseObject = new BaseClass();
        DerivedClass derivedObject = new DerivedClass();

        Console.WriteLine("baseObject is BaseClass Type: {0}", baseObject is BaseClass);
        Console.WriteLine("derivedObject is DerivedClass Type: {0}", derivedObject is DerivedClass);
        Console.WriteLine("baseObject is DerivedClass Type: {0}", baseObject is DerivedClass);

        Console.WriteLine("\nderivedObject is BaseClass Type: {0}", derivedObject is BaseClass);

    }
}

// Output:
   baseObject is BaseClass Type: True
   derivedObject is DerivedClass Type: True
   baseObject is DerivedClass Type: False
   derivedObject is BaseClass Type: True

हम जानते हैं कि हम किसी Base Class Reference द्वारा Derived Class के Object को Refer कर सकते हैं, इसीलिए इस Program का निम्नानुसार Defined अन्तिम Statement True Return कर रहा है:

Console.WriteLine(“\nderivedObject is BaseClass Type: {0}”, derivedObject is BaseClass);

क्योंकि derivedObject वास्तव में BaseClass Type का ही Object है, क्योंकि ये Object DerivedClass का Object है जो कि BaseClass से Derived है।

as Keyword

कई बार हमें हमारे Program के Runtime में Conversion करना होता है, लेकिन Conversion Fail होने की स्थिति में हम कोई Exception Throw करवाना नहीं चाहते। उस स्थिति में हम as Keyword का प्रयोग कर सकते हैं। इस Keyword को भी निम्न Syntax के अनुसार ही Use किया जाता है:

expression is type

जहां expression के रूप में हमें उस Object को Specify करना होता है, जिसे हम Convert करना चाहते हैं जबकि type के रूप में हमें उस Type को Specify करना होता है, जिसके अनुसार हम Expression के रूप में Specified Object को Convert करना चाहते हैं।

यदि expression के रूप में Specified Object type प्रकार में Convert हो जाता है, तो वह Converted Type Return होता है अन्‍यथा null Reference Return होता है। इस Keyword को केवल References, Boxing, Unboxing Identity Conversion के लिए ही Use किया जा सकता है। इस Keyword को ठीक से समझने के लिए हम निम्नानुसार एक Program Create कर सकते हैं:

File Name: asKeyword.cs
using System;

class BaseClass { }
class DerivedClass : BaseClass { }

class asKeywordUsing
{
    public static void Main()
    {
        BaseClass baseObject = new BaseClass();
        DerivedClass derivedObject = new DerivedClass();

        if (baseObject is DerivedClass)
            derivedObject = (DerivedClass)baseObject;
        else
            derivedObject = null;

        if (derivedObject == null)
           Console.WriteLine("The cast in derivedObject=(DerivedClass)baseObject is NOT allowed.");
        else
           Console.WriteLine("The cast in derivedObject=(DerivedClass)baseObject is allowed");
    }
}

Output:
	The cast in derivedObject=(DerivedClass)baseObject is NOT allowed.

जब ये Program Run होता है, तो सबसे पहले BaseClass Type का baseObject व DerivedClass Type का derivedObject Create होता है। फिर निम्नानुसार एक if Statement Execute होता है:

        if (baseObject is DerivedClass)
            derivedObject = (DerivedClass)baseObject;
        else
            derivedObject = null;

इस if Statement में Program Control baseObject को DerivedClass Type में Cast करने की कोशिश करता है। चूंकि baseObject को कभी DerivedClass Type में Cast नहीं किया जा सकताए इसलिए ये if Statement False Return करता है।

परिणामस्वरूप Program Control else Part में जाता है और derivedObject को null Assign कर देता है। जिसकी वजह से अगले if Statement के Execution के कारण हमें उपरोक्तानुसार Output प्राप्त होता है।

typeof Operator

इस Keyword का प्रयोग हम as is Operator की तरह ही करते हुए दो Types की Compatibility को Test कर सकते हैं। अक्सर जब कभी हमें किसी Object के Type का पता लगाना होता है, तब हम इस Operator को Use करते हैं। इस Operator को निम्नानुसार Syntax की तरह Use किया जाता है:

typeof(type)

जहां type के रूप में हमें उस Object को Specify करना होता है, जिसके Type का हम पता लगाना चाहते हैं।

ये Operator किसी Specified type के लिए System.Type Class का एक Object Return करता है, जिसमें Specified type Object के Type से सम्बंधित विभिन्न प्रकार की Information होती हैं।

जब एक बार इस Operator को Use करने के बाद हमें Specified Object से सम्बंधित विभिन्न Information प्राप्त हो जाती हैं, उसके बाद हम उस Return होने वाले Object की विभिन्न Fields, Properties, Methods आदि को Access करके Specified Object से सम्बंधित विभिन्न प्रकार की जानकारियां प्राप्त कर सकते हैं। इस Operator को ठीक से समझने के लिए हम निम्नानुसार एक Program Create कर सकते हैं:

File Name: typeofOperator.cs
using System;
using System.IO;

class typeofUsing
{
    static void Main()
    {
        Type t = typeof(StreamReader);
        Console.WriteLine(t.FullName);

        if (t.IsClass)
            Console.WriteLine("Is a class.");
        if (t.IsAbstract)
            Console.WriteLine("Is abstract.");
        else
            Console.WriteLine("Is concrete.");
    }
}

// Output:
   System.IO.StreamReader
   Is a class.
   Is concrete.

चूंकि typeof Operator वास्तव में System.Type Class का Object Return करता है। इसलिए इस Object के साथ Use किए जा सकने वाले विभिन्न PropertiesMethods की जानकारी प्राप्त करने के लिए हम Visual Studio के Object Browser Utility को Use कर सकते हैं।

The System.Type Class

System.Type Class बहुत सारे ऐसे Members Define करता है, जिनका प्रयोग किसी Type के Metadata को Examine करने के लिए किया जा सकता है और System.Reflection Namespace के ज्यादातर Types System.Type Object ही Return करते हैं। इसलिए System.Reflection Namespace के Types को Use करके हम किसी Assembly के विभिन्न Metadata को आसानी से Access व Manipulate कर सकते हैं।

उदाहरण के लिए जब हम Type.GetMethods() Statement Use करते हैं, तो ये Statement MethodInfo Objects का एक Array Return करता है। इसी तरह से जब हम Type.GetFields() Statement Use करते हैं, तो ये Statement हमें FieldInfo Objects का एक Array Return करता है।

चूंकि System.Type Class द्वारा Provided Properties, Methods व अन्‍य Members की List काफी बडी है और उन सभी के बारे में यहां Discuss करना सम्भव नहीं है। इसलिए इनके बारे में Detailed जानकारी प्राप्त करने के लिए हम Visual Studio के Object Browser Utility का प्रयोग कर सकते हैं। फिर भी हम हमारी जरूरत के आधार पर कुछ Members को अपने आने वाले Examples में Use करेंगे।

.NET Framework के BCL में Type नाम की एक Abstract Class को Define किया गया है, जिसे .NET Framework के किसी Specific Type की Characteristics को Hold करने के लिए ही Design किया गया है। इस Class के Objects का प्रयोग करके हम हमारे Program द्वारा Use किए जा रहे किसी Type के बारे में Detailed Information Retrieve कर सकते हैं।

चूंकि Type एक Abstract Class है, इसलिए इसके Actual Instance Create नहीं किए जा सकते। लेकिन Program के Runtime में CLR इसके एक Derived Type RuntimeType के Instances Create करता है और उन Created Instances का Reference Return करता है, जिनमें Specified type से सम्बंधित Detailed Information होती हैं।

जब हम इन Returned Instances को Access करते हैं, तो CLR हमें RuntimeType नाम के Derived Type का Instance Return नहीं करता बल्कि Type नाम की Base Class का Instance Return करता है। जब हम Reflections को Use करते हैं, तब Type के विषय में कुछ महत्वपूर्ण बातें हैं, जिन्हें ध्‍यान में रखना जरूरी होता है, जो कि निम्नानुसार हैं:

  • Program में Use होने वाला हर Type के लिए CLR एक Type Object Create करता है, जिसमें उसके Type से सम्बंधित जरूरी Information होती हैं।
  • Program में Use किया गया हर Type एक अलग Type Object से Associated रहता है।
  • Program में किसी Specific Type के चाहे जितने Objects Create किए गए हों, उस Type से Associated केवल एक ही Type Object होता है।

System.Type Class Reflection Subsystem का Core है क्योंकि ये ही किसी Type को Encapsulate करता है। इसमें किसी Type से सम्बंधित जानकारियां प्राप्त करने के लिए बहुत सारी Properties व Methods को Defined किया गया हैं। System.Type को System.Reflection.MemberInfo से Derive किया गया है और इस MemberInfo में निम्न Readonly Properties को Define किया गया है:

C# typeof - Reflection in C# - Hindi

जैसाकि इस सारणी में हम देख सकते हैं कि MemberType Property का Return Type MemberTypes है। MemberTypes एक Enumeration है, जिसके द्वारा Defined Values विभिन्न प्रकार के Member Types को Indicate करता है। MemberTypes को हम निम्न Types को Access व Manipulate करने के लिए Use कर सकते हैं:

MemberTypes.Constructor
MemberTypes.Method
MemberTypes.Field
MemberTypes.Event
MemberTypes.Property

इसलिए किसी Member के Type का पता लगाने के लिए हम उसके लिए MemberType को Check कर सकते हैं। उदाहरण के लिए यदि किसी Type का MemberType, MemberTypes.Method के समान हो, तो इसका मतलब यही है कि वह Member एक Method है।

MemberInfo में GetCustomAttributes()IsDefined() नाम के दो Abstract Methods होते हैं। ये दोनों Methods, Attributes से Related होते हैं। पहला Method Invoking Object के Custom Attributes की List से Associated होता है। जबकि दूसरा Method इस बात को तय करता है कि किसी Attribute को Invoking Object के लिए Define किया गया है या नहीं।

C# typeof - Reflection in C# - Hindi

.NET Framework Version 4.0 में GetCustomAttributesData() नाम का एक और Method Add किया गया है, जो कि Custom Attributes से सम्बंधित Data Return करता है। MemberInfo द्वारा जिन Properties Methods को Define किया गया है, उनमें से ज्यादातर को हम System.Type Object के साथ Use कर सकते हैं। System.Type Object के साथ Common रूप से Use किए जाने वाले Methods निम्नानुसार हैं:

C# typeof - Reflection in C# - Hindi

इसी तरह से System.Type Object के साथ Common रूप से Use की जा सकने वाली विभिन्न Readonly Properties को हम निम्नानुसार Specify कर सकते हैं:

C# in Hindiये Article इस वेबसाईट पर Selling हेतु उपलब्‍ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी। 

C#.NET in Hindi | Page:908 | Format: PDF

BUY NOW GET DEMO REVIEWS