Examples of Reflection in C#


Create instance from assembly that is in your project References

The following examples create instances of DateTime class from the System assembly.

// Create instance of class DateTime  
DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime));  

// Create instance of DateTime, use constructor with parameters (year, month, day)  
DateTime dateTime = (DateTime)Activator.CreateInstance(typeof(DateTime), new object[] { 2008, 7, 4 });  

Create instance from dynamically loaded assembly

All the following examples try to access to sample class Calculator from Test.dll assembly. The calculator class can be defined like this.

namespace Test  
{  
    public class Calculator  
    {  
        public Calculator() { ... }  
        private double _number;  
        public double Number { get { ... } set { ... } }  
        public void Clear() { ... }  
        private void DoClear() { ... }  
        public double Add(double number) { ... }  
        public static double Pi { ... }  
        public static double GetPi() { ... }  
    }  
}  

Examples of using reflection to load the Test.dll assembly, to create instance of the Calculator class and to access its members (public/private, instance/static).



    // Dynamically load assembly from file Test.dll  
    Assembly testAssembly = Assembly.LoadFile(@"c:\Test.dll"); 

    // Get type of class Calculator from just loaded assembly  
    Type calcType = testAssembly.GetType("Test.Calculator"); 

    // Create instance of class Calculator  
    object calcInstance = Activator.CreateInstance(calcType); 

    // Get info about property: public double Number  
    PropertyInfo numberPropertyInfo = calcType.GetProperty("Number"); 

    // Get value of property: public double Number  
    double value = (double)numberPropertyInfo.GetValue(calcInstance, null); 

    // Set value of property: public double Number  
    numberPropertyInfo.SetValue(calcInstance, 10.0, null); 

    // Get info about static property: public static double Pi  
    PropertyInfo piPropertyInfo = calcType.GetProperty("Pi"); 

    // Get value of static property: public static double Pi  
    double piValue = (double)piPropertyInfo.GetValue(null, null); 

    // Invoke public instance method: public void Clear()  
    calcType.InvokeMember("Clear",  
        BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public,  
        null, calcInstance, null); 

    // Invoke private instance method: private void DoClear()  
    calcType.InvokeMember("DoClear", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.NonPublic, null, calcInstance, null); 

    // Invoke public instance method: public double Add(double number)  
    double value = (double)calcType.InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, calcInstance, new object[] { 20.0 }); 

    // Invoke public static method: public static double GetPi()  
    double piValue = (double)calcType.InvokeMember("GetPi",  
        BindingFlags.InvokeMethod | BindingFlags.Static | BindingFlags.Public, null, null, null); 

    // Get value of private field: private double _number  
    double value = (double)calcType.InvokeMember("_number",  
    BindingFlags.GetField | BindingFlags.Instance | BindingFlags.NonPublic,
    null, calcInstance, null);  
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s