top
upGrad KnowledgeHut SkillFest Sale!

Search

C# Tutorial

Reflection provide metadata information on types, modules, assemblies etc. at runtime. Therefore, reflection in C# is similar to Runtime Type Information (RTTI) in C++.Uses of ReflectionSome of the situations when reflections are useful in C# are given as follows:Reflections are quite useful for creating new types at runtime.It is easy to use reflection with the program metadata attributes.Reflection is needed to examine and instantiate types in an assembly.For late binding to methods and properties, reflections are quite useful.System.Reflection NamespaceThe System.Reflection namespace is required to use reflections as it has classes that allow the user to get the information required about an application. It also allows the user to dynamically add objects, types, values etc. to the application.Some of the classes in System.Reflection Namespace are as follows:Source: MSDNClassesDescriptionAmbiguousMatchExceptionThe exception that is thrown when binding to a member results in more than one member matching the binding criteria. This class cannot be inherited.AssemblyConfigurationAttributeThis class specifies the build configuration, such as retail or debug, for an assembly.BinderThis class selects a member from a list of candidates, and performs type conversion from actual argument type to formal argument type.ConstructorInfoThis class discovers the attributes of a class constructor and provides access to constructor metadata.EventInfoThis class discovers the attributes of an event and provides access to event metadataFieldInfoThis class discovers the attributes of a field and provides access to field metadata.MemberInfoThis class obtains information about the attributes of a member and provides access to member metadata.PointerThis class provides a wrapper class for pointers.ReflectionContextThis class represents a context that can provide reflection objects.TargetExceptionThis class represents the exception that is thrown when an attempt is made to invoke an invalid target.TypeInfoThis class represents type declarations for class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types.TypeInfo ClassThe TypeInfo class is one of the classes in the System.Reflection namespace. It represents type declarations for class types, array types, interface types, value types, enumeration types etc. This class inherits the IReflectable Type interface.Properties in TypeInfo ClassThe different properties and their description is given as follows:Table: Properties in TypeInfo Class in C#Source: MSDNPropertiesDescriptionCustomAttributesThis property gets a collection that contains this member's custom attributes.DeclaredConstructorsThis property gets a collection of the constructors declared by the current type.DeclaredEventsThis property gets a collection of the events defined by the current type.GenericTypeParametersThis property gets an array of the generic type parameters of the current instance.ImplementedInterfacesThis property gets a collection of the interfaces implemented by the current type.IsConstructedGenericTypeThis property gets a value that indicates whether this object represents a constructed generic type. You can create instances of a constructed generic type.IsContextfulThis property gets a value indicating whether the Type can be hosted in a context.MetadataTokenThis property gets a value that identifies a metadata element.ReflectedTypeThis property gets the class object that was used to obtain this member.TypeHandleThis property gets the handle for the current Type.Methods in TypeInfo ClassThe different methods and their description is given as follows:Table: Methods in TypeInfo Class in C#Source: MSDNMethodsDescriptionAsType()This method returns the current type as a Type object.Equals(Object)This method determines if the underlying system type of the current Type object is the same as the underlying system type of the specified Object.GetCustomAttributes(Boolean)When overridden in a derived class, returns an array of all custom attributes applied to this member.GetDeclaredEvent(String)This method returns an object that represents the specified public event declared by the current type.GetDeclaredField(String)This method returns an object that represents the specified public field declared by the current type.IsArrayImpl()When overridden in a derived class, implements the IsArray property and determines whether the Type is an array.IsContextfulImpl()This method implements the IsContextful property and determines whether the Type can be hosted in a context.IsPointerImpl()When overridden in a derived class, implements the IsPointer property and determines whether the Type is a pointerIsPrimitiveImpl()When overridden in a derived class, implements the IsPrimitive property and determines whether the Type is one of the primitive types.ToString()This method returns a String representing the name of the current Type.GetType()This method gets the current Type.Now let us see some examples:Program 1: Display methods and properties of a classHere is an example showing the usage of getting the methods and properties of TextInfo typeusing System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Globalization; using System.Text; class Example {    static void Main()    {            TypeInfo myType = typeof(TextInfo).GetTypeInfo();            IEnumerable<PropertyInfo> properties = myType.DeclaredProperties;            IEnumerable<MethodInfo> methods = myType.DeclaredMethods;            Console.WriteLine(myType);            Console.WriteLine(properties);            Console.WriteLine(methods);            StringBuilder strBuilder = new StringBuilder();            Console.WriteLine();            strBuilder.Append("The properties are:");            foreach (PropertyInfo p in properties)            {                strBuilder.Append("\n" + p.Name);            }            strBuilder.Append("\n");            strBuilder.Append("\nThe methods are:");            foreach (MethodInfo m in methods)            {                strBuilder.Append("\n" + m.Name);            }            Console.WriteLine(strBuilder);    } }The output of the above program is as follows:System.Globalization.TextInfo System.Reflection.PropertyInfo[] System.Reflection.MethodInfo[] The properties are: Invariant ANSICodePage OEMCodePage MacCodePage EBCDICCodePage LCID CultureName IsReadOnly ListSeparator IsAsciiCasingSameAsInvariant IsRightToLeft The methods are: get_Invariant OnDeserializing OnDeserialized OnDeserialized OnSerializing GetHashCodeOrdinalIgnoreCase GetHashCodeOrdinalIgnoreCase CompareOrdinalIgnoreCase CompareOrdinalIgnoreCaseEx IndexOfStringOrdinalIgnoreCase LastIndexOfStringOrdinalIgnoreCase get_ANSICodePage get_OEMCodePage get_MacCodePage get_EBCDICCodePage get_LCID get_CultureName get_IsReadOnly Clone ReadOnly VerifyWritable SetReadOnlyState get_ListSeparator set_ListSeparator ToLower ToLower ToLowerAsciiInvariant ToUpper ToUpper ToUpperAsciiInvariant IsAscii get_IsAsciiCasingSameAsInvariant Equals GetHashCode ToString ToTitleCase AddNonLetter AddTitlecaseLetter IsWordSeparator IsLetterCategory get_IsRightToLeft System.Runtime.Serialization.IDeserializationCallback.OnDeserialization GetCaseInsensitiveHashCode GetCaseInsensitiveHashCode GetInvariantCaseInsensitiveHashCode ToUpperInternal ToLowerInternal ToUpperInternal ToLowerInternal InternalCompareStringOrdinalIgnoreCaseProgram 2: Display the types of various variables using GetType() methodThe GetType() method indicates the type of a variable or object. An example that demonstrates this method is as follows:using System;   using System.Reflection;   public class Demo   {      public static void Main()      {        // Type One        Type type1 = typeof(object[]);        // Type Two        Type type2 = "demo string".GetType();        // Type Three        int val1 = 50;          Type type3 = val1.GetType();          Console.WriteLine(type1);        Console.WriteLine(type1.Name);        Console.WriteLine(type2);        Console.WriteLine(type2.Name);        Console.WriteLine(type3);          Console.WriteLine(type3.Name);    } }The output of the above program is as follows:System.Object[] Object[] System.String String System.Int32 Int32Program 3: AssemblyQualifiedName PropertyThe AssemblyQualifiedName property displays the qualified assembly name associated with a type. The program that demonstrates this property is as follows:using System;   using System.Reflection;   public class Demo   {      public static void Main()      {         Type tp = typeof(System.Object);        Console.WriteLine ("Qualified assembly name:\n   {0}.",                           tp.AssemblyQualifiedName.ToString());    } }  The output of the above program is as follows:Qualified assembly name: System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.Program 4: Assembly PropertyThe Assembly property displays the assembly name associated with a type. The program that demonstrates this property is as follows:using System;   using System.Reflection;   public class Demo   {      public static void Main()      {         Type tp = typeof(System.Object);        Console.WriteLine ("Assembly name:\n   {0}.",                           tp.Assembly.FullName.ToString());     } }The following is the output:Qualified assembly name:   System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089.Program 5: Name propertyThe Name property displays the name of the type. The program that demonstrates this property is as follows:using System;   using System.Reflection;   public class Demo   {      public static void Main()      {        Type tp1 = typeof(System.UInt64);        Type tp2 = typeof(System.UInt32);        Type tp3 = typeof(System.UInt16);        Type tp4 = typeof(System.Uri);        Console.WriteLine(tp1.Name);          Console.WriteLine(tp1.BaseType);          Console.WriteLine(tp2.Name);          Console.WriteLine(tp2.BaseType);        Console.WriteLine(tp3.Name);          Console.WriteLine(tp3.BaseType);        Console.WriteLine(tp4.Name);          Console.WriteLine(tp4.BaseType);    } }Here is the output:UInt64 System.ValueType UInt32 System.ValueType UInt16 System.ValueType Uri System.ObjectProgram 6: FullName propertyThe FullName property displays the fully qualified name of the type. The program that demonstrates this property is as follows:using System;   using System.Reflection;   public class Demo   {      public static void Main()      {        Type tp = typeof(System.SByte);          Console.WriteLine(tp.FullName);          Console.WriteLine(tp.BaseType);      } }  Here is the output:System.SByte System.ValueType
logo

C# Tutorial

Reflection in C#

Reflection provide metadata information on types, modules, assemblies etc. at runtime. Therefore, reflection in C# is similar to Runtime Type Information (RTTI) in C++.

Uses of Reflection

Some of the situations when reflections are useful in C# are given as follows:

  1. Reflections are quite useful for creating new types at runtime.
  2. It is easy to use reflection with the program metadata attributes.
  3. Reflection is needed to examine and instantiate types in an assembly.
  4. For late binding to methods and properties, reflections are quite useful.

System.Reflection Namespace

The System.Reflection namespace is required to use reflections as it has classes that allow the user to get the information required about an application. It also allows the user to dynamically add objects, types, values etc. to the application.

Some of the classes in System.Reflection Namespace are as follows:

Source: MSDN

ClassesDescription
AmbiguousMatchExceptionThe exception that is thrown when binding to a member results in more than one member matching the binding criteria. This class cannot be inherited.
AssemblyConfigurationAttributeThis class specifies the build configuration, such as retail or debug, for an assembly.
BinderThis class selects a member from a list of candidates, and performs type conversion from actual argument type to formal argument type.
ConstructorInfoThis class discovers the attributes of a class constructor and provides access to constructor metadata.
EventInfoThis class discovers the attributes of an event and provides access to event metadata
FieldInfoThis class discovers the attributes of a field and provides access to field metadata.
MemberInfoThis class obtains information about the attributes of a member and provides access to member metadata.
PointerThis class provides a wrapper class for pointers.
ReflectionContextThis class represents a context that can provide reflection objects.
TargetExceptionThis class represents the exception that is thrown when an attempt is made to invoke an invalid target.
TypeInfoThis class represents type declarations for class types, interface types, array types, value types, enumeration types, type parameters, generic type definitions, and open or closed constructed generic types.

TypeInfo Class

The TypeInfo class is one of the classes in the System.Reflection namespace. It represents type declarations for class types, array types, interface types, value types, enumeration types etc. This class inherits the IReflectable Type interface.

Properties in TypeInfo Class

The different properties and their description is given as follows:

Table: Properties in TypeInfo Class in C#

Source: MSDN

PropertiesDescription
CustomAttributesThis property gets a collection that contains this member's custom attributes.
DeclaredConstructorsThis property gets a collection of the constructors declared by the current type.
DeclaredEventsThis property gets a collection of the events defined by the current type.
GenericTypeParametersThis property gets an array of the generic type parameters of the current instance.
ImplementedInterfacesThis property gets a collection of the interfaces implemented by the current type.
IsConstructedGenericTypeThis property gets a value that indicates whether this object represents a constructed generic type. You can create instances of a constructed generic type.
IsContextfulThis property gets a value indicating whether the Type can be hosted in a context.
MetadataTokenThis property gets a value that identifies a metadata element.
ReflectedTypeThis property gets the class object that was used to obtain this member.
TypeHandleThis property gets the handle for the current Type.

Methods in TypeInfo Class

The different methods and their description is given as follows:

Table: Methods in TypeInfo Class in C#

Source: MSDN

MethodsDescription
AsType()This method returns the current type as a Type object.
Equals(Object)This method determines if the underlying system type of the current Type object is the same as the underlying system type of the specified Object.
GetCustomAttributes(Boolean)When overridden in a derived class, returns an array of all custom attributes applied to this member.
GetDeclaredEvent(String)This method returns an object that represents the specified public event declared by the current type.
GetDeclaredField(String)This method returns an object that represents the specified public field declared by the current type.
IsArrayImpl()When overridden in a derived class, implements the IsArray property and determines whether the Type is an array.
IsContextfulImpl()This method implements the IsContextful property and determines whether the Type can be hosted in a context.
IsPointerImpl()When overridden in a derived class, implements the IsPointer property and determines whether the Type is a pointer
IsPrimitiveImpl()When overridden in a derived class, implements the IsPrimitive property and determines whether the Type is one of the primitive types.
ToString()This method returns a String representing the name of the current Type.
GetType()This method gets the current Type.

Now let us see some examples:

Program 1: Display methods and properties of a class

Here is an example showing the usage of getting the methods and properties of TextInfo type

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Globalization;
using System.Text;
class Example
{
   static void Main()
   {
           TypeInfo myType = typeof(TextInfo).GetTypeInfo();
           IEnumerable<PropertyInfo> properties = myType.DeclaredProperties;
           IEnumerable<MethodInfo> methods = myType.DeclaredMethods;
           Console.WriteLine(myType);
           Console.WriteLine(properties);
           Console.WriteLine(methods);
           StringBuilder strBuilder = new StringBuilder();
           Console.WriteLine();
           strBuilder.Append("The properties are:");
           foreach (PropertyInfo p in properties)
           {
               strBuilder.Append("\n" + p.Name);
           }
           strBuilder.Append("\n");
           strBuilder.Append("\nThe methods are:");
           foreach (MethodInfo m in methods)
           {
               strBuilder.Append("\n" + m.Name);
           }
           Console.WriteLine(strBuilder);
   }
}

The output of the above program is as follows:

System.Globalization.TextInfo
System.Reflection.PropertyInfo[]
System.Reflection.MethodInfo[]

The properties are:
Invariant
ANSICodePage
OEMCodePage
MacCodePage
EBCDICCodePage
LCID
CultureName
IsReadOnly
ListSeparator
IsAsciiCasingSameAsInvariant
IsRightToLeft

The methods are:
get_Invariant
OnDeserializing
OnDeserialized
OnDeserialized
OnSerializing
GetHashCodeOrdinalIgnoreCase
GetHashCodeOrdinalIgnoreCase
CompareOrdinalIgnoreCase
CompareOrdinalIgnoreCaseEx
IndexOfStringOrdinalIgnoreCase
LastIndexOfStringOrdinalIgnoreCase
get_ANSICodePage
get_OEMCodePage
get_MacCodePage
get_EBCDICCodePage
get_LCID
get_CultureName
get_IsReadOnly
Clone
ReadOnly
VerifyWritable
SetReadOnlyState
get_ListSeparator
set_ListSeparator
ToLower
ToLower
ToLowerAsciiInvariant
ToUpper
ToUpper
ToUpperAsciiInvariant
IsAscii
get_IsAsciiCasingSameAsInvariant
Equals
GetHashCode
ToString
ToTitleCase
AddNonLetter
AddTitlecaseLetter
IsWordSeparator
IsLetterCategory
get_IsRightToLeft
System.Runtime.Serialization.IDeserializationCallback.OnDeserialization
GetCaseInsensitiveHashCode
GetCaseInsensitiveHashCode
GetInvariantCaseInsensitiveHashCode
ToUpperInternal
ToLowerInternal
ToUpperInternal
ToLowerInternal
InternalCompareStringOrdinalIgnoreCase

Program 2: Display the types of various variables using GetType() method

The GetType() method indicates the type of a variable or object. An example that demonstrates this method is as follows:

using System;  
using System.Reflection;  
public class Demo  
{  
   public static void Main()  
   {
       // Type One
       Type type1 = typeof(object[]);
       // Type Two
       Type type2 = "demo string".GetType();
       // Type Three
       int val1 = 50;  
       Type type3 = val1.GetType();  
       Console.WriteLine(type1);
       Console.WriteLine(type1.Name);
       Console.WriteLine(type2);
       Console.WriteLine(type2.Name);
       Console.WriteLine(type3);  
       Console.WriteLine(type3.Name);
   }
}

The output of the above program is as follows:

System.Object[]
Object[]
System.String
String
System.Int32
Int32

Program 3: AssemblyQualifiedName Property

The AssemblyQualifiedName property displays the qualified assembly name associated with a type. The program that demonstrates this property is as follows:

using System;  
using System.Reflection;  
public class Demo  
{  
   public static void Main()  
   {
        Type tp = typeof(System.Object);
       Console.WriteLine ("Qualified assembly name:\n   {0}.",
                          tp.AssemblyQualifiedName.ToString());
   }
}  

The output of the above program is as follows:

Qualified assembly name:
System.Object, mscorlib, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089.

Program 4: Assembly Property

The Assembly property displays the assembly name associated with a type. The program that demonstrates this property is as follows:

using System;  
using System.Reflection;  
public class Demo  
{  
   public static void Main()  
   {
        Type tp = typeof(System.Object);
       Console.WriteLine ("Assembly name:\n   {0}.",
                          tp.Assembly.FullName.ToString());
    }
}

The following is the output:

Qualified assembly name:
  System.Object, mscorlib, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089.

Program 5: Name property

The Name property displays the name of the type. The program that demonstrates this property is as follows:

using System;  
using System.Reflection;  
public class Demo  
{  
   public static void Main()  
   {
       Type tp1 = typeof(System.UInt64);
       Type tp2 = typeof(System.UInt32);
       Type tp3 = typeof(System.UInt16);
       Type tp4 = typeof(System.Uri);
       Console.WriteLine(tp1.Name);  
       Console.WriteLine(tp1.BaseType);  
       Console.WriteLine(tp2.Name);  
       Console.WriteLine(tp2.BaseType);
       Console.WriteLine(tp3.Name);  
       Console.WriteLine(tp3.BaseType);
       Console.WriteLine(tp4.Name);  
       Console.WriteLine(tp4.BaseType);
   }
}

Here is the output:

UInt64
System.ValueType
UInt32
System.ValueType
UInt16
System.ValueType
Uri
System.Object

Program 6: FullName property

The FullName property displays the fully qualified name of the type. The program that demonstrates this property is as follows:

using System;  
using System.Reflection;  
public class Demo  
{  
   public static void Main()  
   {
       Type tp = typeof(System.SByte);  
       Console.WriteLine(tp.FullName);  
       Console.WriteLine(tp.BaseType);  
   }
}  

Here is the output:

System.SByte
System.ValueType

Leave a Reply

Your email address will not be published. Required fields are marked *

Comments

austin faith

Avery good write-up. Please let me know what are the types of C# libraries used for AI development.

kariya arti

very satisfied!!

jean-Francois Michaud

Good tutorial. Small question: Say, there is : enum numbers { one, two, three} and a string field_enum ="one" how would I from the variable field_enum have a response with value numbers.one so that it can be treated as an enum and not as a string. making a list from the enum, and loop into the list. is not elegant... and may not work is forced value on field is forced ( one = 100).

Kshitiz

Hi Team Knowledge Hut, Thank you for such an informative post like this. I am completely new to this digital marketing field and do not have much idea about this, but your post has become a supportive pillar for me. After reading the blog I would expect to read more about the topic. I wish to get connected with you always to have updates on these sorts of ideas. Regards, Kshitiz

Ed

The reason abstraction can be used with this example is because, the triangle, circle. Square etc can be defined as a shape, for example.....shape c = new circle(5,0)...the abstract object c now points at the circle class. Thus hiding implementation

Suggested Tutorials

Swift Tutorial

Introduction to Swift Tutorial
Swift Tutorial

Introduction to Swift Tutorial

Read More

R Programming Tutorial

R Programming

Python Tutorial

Python Tutorial