Reflection in C# – Using with Example

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

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

BUY NOW DOWNLOAD READ ONLINE

किसी System.Type Object की Properties Methods को Use करके हम उस Type से सम्बंधित विभिन्न प्रकार की Information को Programmatically Runtime में Access कर सकते हैं, जो कि Reflection द्वारा Provide किया जाने वाला एक बहुत ही महत्वपूर्ण Feature है।

क्योंकि जब हम किसी Type की Information को प्राप्त कर लेते हैं, हम उसके Constructor को Invoke कर सकते हैं, उसके Methods को Call कर सकते हैं और उसकी Properties को Access कर सकते हैं।

अत: Reflection हमें किसी Assembly की उन Information को Access करने की सुविधा Provide करता है, जो कि Program के Compile Time में Available नहीं होती हैं।

.NET Framework में Defined Reflection API काफी बडा है और उसके सभी Members को Discuss करना सम्भव नहीं है। लेकिन Reflection API इतना Logical तरीके से Design किया गया है, कि यदि हम इसके किसी एक हिस्से को Use करने के बारे में समझ लें, तो फिर हम बिना किसी परेशानी के इसके किसी भी हिस्से को Use कर सकते हैं।

Obtaining Type Reference using System.Object.GetType()

हालांकि हम System.Type Class का Direct Object Create नहीं कर सकते, लेकिन हम हमारे Program में कई तरीकों से किसी Type के Reference को Retrieve कर सकते हैं और किसी Type को Retrieve करने के लिए हम सबसे पहले System.Object द्वारा Provided GetType() Method को Use कर सकते हैं, जो कि Current Object के Metadata को एक Type Class Instance के रूप में Represent करता है। जैसे:

BaseClass baseObject = new BaseClass();
Type baseObjectType = baseObject.GetType();

हम समझ सकते हैं कि ये तरीका केवल तभी उपयोगी होगा, जब हमें Compile Time में ही पता हो कि हम किस Type के Object को Reflect करना चाहते हैं और Currently Memory में किस Type के Object का Instance Exist है।

Obtaining Type Reference using typeof()

C# में typeof() Operator का प्रयोग करके भी हम Program के Runtime में किसी Object के Type का पता लगा सकते हैं। इसके बारे में हमने Runtime Type Identification Section में काफी Detail से Discussion किया है।

System.Object.GetType() की तुलना में इस typeof() Operator की मुख्‍य विशेषता ये है कि इसे Use करते समय ये जरूरी नहीं होता कि हमें Compile Time में पता हो कि हम किस Type के Object के साथ प्रक्रिया कर रहे हैं। हालांकि इस Operator को Use करते समय भी हमारे Program को Compile Time में इस बात की जानकारी होती है कि हम typeof() Operator के साथ किस Type के Object को Use कर रहे हैं।

Obtaining Type Reference using System.Type.GetType()

किसी Object के Type की Information को Retrieve करने का ये सबसे उपयुक्त तरीका होता है। GetType() Method वास्तव में System.Type Class का एक Static Method है, जिसमें हमें जिस Object के Type का पता लगाना होता है, उसे इस Method में एक Fully Qualified String Name के रूप में Specify करना होता है। इस Approach का प्रयोग करने पर हमें उस Type के बारे में Compile Type Information की जरूरत नहीं होती, जिसके Metadata को हम Access करना चाहते हैं।

Type.GetType() Method को Overload किया गया है, ताकि हम इसमें दो Boolean Parameters Specify कर सकें। जहां पहला Boolean Parameter इस बात को Control करता है कि यदि किसी Specified Object का Type प्राप्त न हो तो कोई Exception Throw करना है या नहीं तथा दूसरा Boolean Parameter इस बात को Control करता है कि इस Method में Specified String को Case Sensitive माना जाए या नहीं।

उदाहरण के लिए यदि हम नहीं चाहते कि यदि BaseClass Type Identify न हो, तो कोई Exception Generate हो न ही हम ये चाहते हैं कि हमारा Type Searching, Case Sensitive हो, तो हम इस Method को निम्नानुसार तरीके से Use कर सकते हैं:

//Don’t throw an exception if BaseClass can’t be found and ignore case
Type baseObjectType = Type.GetType(“MyLibrary.BaseClass”, false, true);

इस उदाहरण में हमने उस Assembly को Specify नहीं किया है, जिसमें हमारा BaseClass नाम का Type Exist है, क्योंकि यहां हम यही मान रहे हैं कि हमारा Type Current Assembly में ही Exist है। लेकिन यदि हम किसी External Private Assembly के किसी Type की Metadata Information को Access करना चाहते हैं, तो हमें हमारे Type को Fully Qualified Name String के रूप में Specify करने के बाद एक Comma Use करते हुए उस External Assembly को भी Specify करना जरूरी होता है, जिसमें BaseClass Type Exist है। जैसे:

//Don’t throw an exception if BaseClass can’t be found and ignore case
Type baseObjectType = Type.GetType(“MyLibrary.BaseClass, MyAssembly“, false, true);

साथ ही जब हम Type.GetType() में किसी Nested Type को Denote करना चाहते हैं, तो हमें Nested Type को एक “+” Token द्वारा Add करना होता है। जैसे:

Type baseObjectType = Type.GetType(“MyLibrary.NestedNamespace+BaseClass“);

ये Statement इस बात को Indicate कर रहा है कि BaseClass एक NestedNamespcae नाम के Nested Namespace में है जबकि ये Namespace स्वयं  MyLibrary में Exist है।

File Name: GettingTypes.cs
using System;
using System.Reflection; 		// Must use this namespace

class BaseClass { }
class DerivedClass : BaseClass { }

class Program
{
    static void Main()
    {
        var baseObject = new BaseClass();
        var derivedObject = new DerivedClass();
        BaseClass[] bca = new BaseClass[] { baseObject, derivedObject };

        foreach (var v in bca)
        {
            Type typeObject = v.GetType();
            Console.WriteLine("Object type : {0}", typeObject.Name);
        }
    }
}

Output:
   Object type : BaseClass
   Object type : DerivedClass

इस Program में हमने BaseClassDerivedClass नाम की दो Classes Create की हैं और दोनों ही Classes के Objects के Reference को bca नाम के एक Array में Store किया है, ताकि हम एक System.Type प्रकार के Reference Variable द्वारा इन्हे Refer कर सकें।

इसीलिए foreach Loop में हमने System.Type प्रकार का typeObject नाम का एक Reference Create किया है और bca नाम के Array में Stored Types के References को One by One इस Reference Variable में Store करके इसकी Name Property को Access करते हुए सभी Type Names को Output में Display किया है।

Retrieving Methods Information

जब हमारे पास किसी Specific Type का Object होता है, तो हम उस Type के सभी Public Members की List प्राप्त करने के लिए GetMethods() नाम के Method को Invoke कर सकते हैं, जिसका Syntax निम्नानुसार होता है:

MethodInfo[] GetMethods()

इस Syntax में MethodInfo[] Objects का एक Array है, जो Method को Invoke करने वाले Object द्वारा Supported Public Methods की List को Represent करता है। इस MethodInfo को System.Reflection Namespace में Define किया गया है।

जबकि MethodInfo को Internally MethodBase नाम की Abstract Class से Derive किया गया है। इसलिए इन तीनों ही Classes द्वारा जिन Properties व Methods को Define किया गया है, उन सभी Properties Methods को हम उपयोग में ले सकते हैं।

उदाहरण के लिए यदि हम अपने Type Object के किसी Method के नाम का पता लगाना चाहें, तो हम Name Property को Use कर सकते हैं। जैसे:

File Name: GettingTypeMethods.cs
using System;
using System.Reflection; // Must use this namespace

namespace Reflection
{
    class Coordinate
    {
        int x, y;

        public Coordinate(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public void Position(string msg)
        {
            Console.WriteLine("{0} : {1},{2}", msg, x, y);
        }
    }

    class Program
    {
        static void Main()
        {
            Type typeObject = typeof(Coordinate);
            MethodInfo[] methods = typeObject.GetMethods();

            Console.WriteLine("Methods Exists in Current Program:");
            foreach (MethodInfo method in methods)
                Console.WriteLine("Method Name: {0}", method.Name);

        }
    }
}

// Output:
   Methods Exists in Current Program:
   Method Name: Position
   Method Name: ToString
   Method Name: Equals
   Method Name: GetHashCode
   Method Name: GetType

इस Program में हमने केवल Position() नाम का एक ही Method Define किया है लेकिन जैसाकि हम Output में देख सकते हैं, हमें हमारे द्वारा Defined Position() Method के अलावा भी कई और Methods के नाम दिखाई दे रहे हैं। ये सभी वे Methods हैं, जो किसी भी Program में System.Object से Derive होते हैं।

जब हम इस Program को Run करते हैं, तो निम्नानुसार Statement द्वारा सबसे पहले System.Type प्रकार का typeObject नाम का एक Reference Variable Create होता है और इस Reference Variable में Coordinate Type की Metadata Information Fill हो जाती है:

Type typeObject = typeof(Coordinate);

जब एक बार हमें Coordinate Type की Metadata Information typeObject नाम के System.Type प्रकार के Reference Variable में प्राप्त हो जाती है, तो हम इस typeObject को अपने Specified Type की विभिन्न प्रकार की Information प्राप्त करने के लिए Scan कर सकते हैं।

चूंकि हम जानना चाहते हैं कि हमारे Coordinate Type में कौन-कौन से Methods Exist हैं, जिन्हें Current Program में Access किया जा सकता है और ये जानकारी प्राप्त करने के लिए हमें GetMethods() नाम के Method को Use करना होता है, जो कि MethodInfo Type के Objects का एक Array Return करता है।

इसलिए GetMethods() द्वारा Return होने वाले MethodInfo Type के Objects के Array को Retrieve करने के लिए हमने निम्नानुसार Statement द्वारा MethodInfo Type का एक Array Create किया है:

MethodInfo[] methods = typeObject.GetMethods();

इस Statement के Execute होने पर typeObject में Stored Coordinate Type में Exist सभी Accessible Methods की Information एक Array के रूप में हमें methods नाम के MethodInfo Type के Array में प्राप्त हो जाती है। जिसे निम्नानुसार foreach Looping Statement द्वारा One by One Display कर दिया जाता है:

foreach (MethodInfo method in methods)
Console.WriteLine(“{0}”, method.Name);

परिणामस्वरूप ये foreach Statement Coordinate Type के सभी Members के नामों को Name Property Access करते हुए Output में Display कर देता है और हमें उपरोक्तानुसार Output प्राप्त हो जाता है, जिसमें Coordinate Type के सभी Methods का नाम एक List के रूप में Display हो जाता है।

Retrieving Parameters Information of Method

जैसाकि उपरोक्त Statement में हमने Name Property को Access करते हुए हमने Methods के नामों को Retrieve किया है, उसी तरह से हम Name Property के साथ ही ReturnType Property व GetParameters() Method को उपयोग में लेकर Method के Return TypeParameters के बारे में Information Retrieve कर सकते हैं।

ReturnType Property में हमारे Method द्वारा Return होने वाले Type की Information होती है, जो कि एक System.Type प्रकार का Object होता है। जबकि GetParameters() नाम का Method हमारे Method द्वारा Accept किए जाने वाले Parameters को एक ParameterInfo Type के Objects के Array के रूप में Return करता है। इस Method का General Form निम्नानुसार होता है:

ParameterInfo[] GetParameters()

ParameterInfo जिन PropertiesMethods को Define करता है, उन्हें Specified Method द्वारा Accepted Parameters को Describe करने के लिए Use किया जा सकता है। यहां भी ParameterInfo से सम्बंधित Information प्राप्त करने के लिए हम Name Property का प्रयोग कर सकते हैं, जिसमें Specified Method के किसी Specific Parameter का नाम होता है। जबकि ParameterType नाम की दूसरी Property द्वारा हम उस Parameter के Type का पता लगा सकते हैं। जैसे:

File Name: GettingTypeMethodsWithParameters.cs
using System;
using System.Reflection; // Must use this namespace

namespace Reflection
{
    class Coordinate
    {
        int x, y;

        public Coordinate(int x, int y)
        {
            this.x = x;
            this.y = y;
        }

        public void Position(string msg)
        {
            Console.WriteLine("{0} : {1},{2}", msg, x, y);
        }
    }

    class Program
    {
        static void Main()
        {
            Type typeObject = typeof(Coordinate);
            MethodInfo[] methods = typeObject.GetMethods();

            Console.Write("Methods Exists in Current Program:");
            foreach (MethodInfo method in methods)
            {
                Console.WriteLine("\nMethod Name: {0}", method.Name);

                ParameterInfo[] parameters = method.GetParameters();

                Console.WriteLine("Parameters Exists in {0}:", method.Name);
                foreach (ParameterInfo parameter in parameters)
                    Console.WriteLine("\tName: {0}\n\tType: {1}", parameter.Name, parameter.ParameterType);
            }
        }
    }
}

Output:
   Methods Exists in Current Program:
   Method Name: Position
   Parameters Exists in Position:
	Name: msg
	Type: System.String

   Method Name: ToString
   Parameters Exists in ToString:

   Method Name: Equals
   Parameters Exists in Equals:
	Name: obj
	Type: System.Object

   Method Name: GetHashCode
   Parameters Exists in GetHashCode:

   Method Name: GetType
   Parameters Exists in GetType:

जैसाकि इस Program के Output में हम देख सकते हैं कि केवल Position()Equals() नाम के दो ही ऐसे Method हमारे Coordinate Type में Exist हैं, जो कि एक Single Parameter Accept करते हैं। जबकि अन्‍य Methods किसी तरह का कोई Parameter Accept नहीं करते।

ये Program Exactly पिछले Program की तरह ही है जिसमें Coordinate Type को बिल्कुल भी Modify नहीं किया गया है। लेकिन Coordinate Type में Exist सभी Methods के Parameters को Access करने के लिए Main() Method में निम्नानुसार तरीके से ParameterInfo Type का एक Objects का Array Create किया गया है।

क्योंकि इन Method के Parameters को Retrieve करने के लिए हमें Method के Reference के साथ GetParameters() नाम के Method को Use करना होता है और ये Method ParameterInfo Type के Objects का Array Return करता है, जिसे Retrieve करने के लिए हमे निम्न Statement द्वारा parameters नाम का एक ParameterInfo Type के Objects का एक Array Create किया है:

ParameterInfo[] parameters = method.GetParameters();

फिर हमने निम्नानुसार Statement द्वारा हर Parameter के NameType को Output में Display करने के लिए एक Nested foreach Loop Use किया है:

foreach (ParameterInfo parameter in parameters)
Console.WriteLine(“\tName: {0}\n\tType: {1}”, parameter.Name, parameter.ParameterType);

जो कि हर Method के Parameters को One by One Scan करता है और Output में Display करता है।

Retrieving Fields Information

जिस तरह से Methods की Information को GetMethods() तथा Parameters की Information को GetParameters() Method द्वारा Retrieve किया जाता है, उसी तरह से किसी Type के विभिन्न Fields की Information को Retrieve करने के लिए हम GetFields() Method को Use कर सकते हैं और ये Method भी FieldInfo Type के Objects का एक Array Return करता है, जिसे हम उसी तरह से उपयोग में ले सकते हैं, जिस तरह से हमने GetMethods() व GetParameters() Method को Use किया है। इस Method का Syntax निम्नानुसार होता है:

FieldInfo[] GetFields()

जहां FieldInfo वह Return  Type है, जिसमें जिसे GetFields() Method Objects का Array Return करता है।

Invoking Methods using Reflection

जब एक बार हमें पता चल जाता है कि Specified Type किन Methods को Support करता है, उसके बाद हम उन Methods को Reflection के माध्‍यम से Invoke भी कर सकते हैं। किसी Method को Invoke करने के लिए हमे MethodInfo Type के Object में Stored Methods को Invoke() Method का प्रयोग करते हुए Invoke करना होता है। इस Method का Syntax निम्नानुसार होता है:

object Invoke(object obj, object[] parameters)

जहां obj उस Object का Reference है, जिसके लिए Method को Invoke किया गया है। Static Methods के लिए इसका मान null होता है। Invoke किए जाने वाले Method में हमें जो भी Parameters Pass करने होते हैं, उन्हें parameters के Array के रूप में Pass किया जाता है। जबकि यदि Invoke किए जाने वाले Method में कोई Parameter Pass न करना हो, तो हम parameters को भी null Set कर सकते हैं।

जब हम Parameters Pass करते हैं, तब हमें इस बात का ध्‍यान जरूर रखना होता है कि हम जितने Parameters Pass करते हैं, Invoke किए जाने वाले Method द्वारा Accept किए जा सकने वाले Parameters की संख्‍या भी उतनी ही होनी चाहिए। यानी यदि Invoke होने वाला Method केवल दो ही Parameters Accept करता है, तो हम तीन या एक Parameter Specify नहीं कर सकते।

Dynamically Loading Assemblies

जब हम जरूरत के आधार पर किसी Assembly को Program के Runtime में Memory में Load करते हैं, तो इस प्रक्रिया को Dynamic Load कहा जाता है। System.Reflection में Assembly नाम की एक Class को Define किया गया है। इस Class का प्रयोग करके हम किसी Assembly को Dynamically Load कर सकते हैं और किसी Assembly को Dynamically Load करने के लिए हम Assembly Class के Load() LoadFrom() Method को Use कर सकते हैं।

Reflection एक बहुत बडा Library या API है जो हमें किसी .NET Assembly को Programmatically Disassemble करते हुए Special तरीके से उपयोग में लेने की सुविधा Provide करते हैं। लेकिन इस API के विभिन्न Members के बारे में Detail से Discuss करना सम्भव नहीं है।

फिर भी जिस तरह से हमने पिछले कुछ Sections में Assembly के Codes को Programmatically Access किया है, उसी तरह से हम किसी Assembly के अन्‍य Members को Access करने के लिए Reflection API के अन्‍य Members को उपयोग में ले सकते हैं। जबकि Reflection के विभिन्न Members की Detailed जानकारी प्राप्त करने के लिए Visual Studio के Object Browser को उपयोग में लिया जा सकता है।

C# typeof - Reflection in C#

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

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

BUY NOW DOWNLOAD READ ONLINE

Download All Hindi EBooks

सभी हिन्दी EBooks C, C++, Java, C#, ASP.NET, Oracle, Data Structure, VB6, PHP, HTML5, JavaScript, jQuery, WordPress, etc... के DOWNLOAD LINKS प्राप्‍त करें, अपने EMail पर।

Register करके Login करें। इस Popup से छुटकारा पाएें।