Introduction
Reflection is the ability of a managed code to read its own metadata for the purpose of finding assemblies, modules and type information at runtime. In other words, reflection provides objects that encapsulate assemblies, modules and types. A program reflects on itself by extracting metadata from its assembly and using that metadata either to inform the user or to modify its own behavior. Reflection is similar to C++ RTTI (Runtime Type Information), but much broader in scope and capability. By using Reflection in C#, one is able to find out details of an object, method, and create objects and invoke methods at runtime. The System.Reflection
namespace contains classes and interfaces that provide a managed view of loaded types, methods, and fields, with the ability to dynamically create and invoke types. When writing a C# code that uses reflection, the coder can use the typeof operator to get the object's type or use the GetType()
method to get the type of the current instance. Here are sample codes that demonstrate the use of reflection:
Example 1
using System;
using System.Reflection;
public class MyClass
{
public virtual int AddNumb(int numb1,int numb2)
{
int result = numb1 + numb2;
return result;
}
}
class MyMainClass
{
public static int Main()
{
Console.WriteLine ("\nReflection.MethodInfo");
MyClass myClassObj = new MyClass();
Type myTypeObj = myClassObj.GetType();
MethodInfo myMethodInfo = myTypeObj.GetMethod("AddNumb");
object[] mParam = new object[] {5, 10};
Console.Write("\nFirst method - " + myTypeObj.FullName + " returns " +
myMethodInfo.Invoke(myClassObj, mParam) + "\n");
return 0;
}
}
Firstly, the code snippet below will get the type
information:
Type myTypeObj = Type.GetType("MyClass");
And myTypeObj
will now have the required information about MyClass
. Therefore we can now check if the class is an abstract
class or a regular class by using either of these statements:
myTypeObj.IsAbstract
or:
myTypeObj.IsClass
The code snippet below will get the method's information. And the method that we are interested in this case is AddNumb
:
Methodinfo myMethodInfo = myTypeObj.GetMethod("AddNumb");
The following code snippet will invoke the AddNumb
method:
myMethodInfo.Invoke(myClassObj, mParam);
Public class MyClass2
{
int answer;
public MyClass2()
{
answer = 0;
}
public int AddNumb(intnumb1, intnumb2)
{
answer = numb1 + numb2;
return answer;
}
}
The code snippet below gets the System.Type
object for the MyClass2 type
.
Type type1 = typeof(MyClass2);
So we will now be able to create an instance of the type1
object by passing the type1
object to the Activator.CreateInstance(type1)
method.
object obj = Activator.CreateInstance(type1);
Then we can now invoke the AddNumb
method of the MyClass2
class by first creating an array of objects for the arguments that we would be passing to the AddNumb(int, int)
method.
object[] mParam =newobject[] {5, 10};
Finally, we would invoke the AddNumb(int, int)
method by passing the method name AddNumb
to System.Type.InvokeMember()
with the appropriate arguments.
int res = (int)type1.InvokeMember("AddNumb", BindingFlags.InvokeMethod,null,
obj, mParam);
using System;
using System.Reflection;
namespace Reflection
{
class Class1
{
public int AddNumb(int numb1, int numb2)
{
int ans = numb1 + numb2;
return ans;
}
[STAThread]
static void Main(string[] args)
{
Type type1 = typeof(Class1);
object obj = Activator.CreateInstance(type1);
object[] mParam = new object[] {5, 10};
int res = (int)type1.InvokeMember("AddNumb", BindingFlags.InvokeMethod,
null, obj, mParam);
Console.Write("Result: {0} \n", res);
}
}
}