Reflection, System.Reflection s-ar prezenta namespace-ul daca ar fi sa foloseasca stilul lui Bond, James Bond!
Namespace-ul System.Reflection namespace contine tipuri (clase) cu ajutorul carora se pot obtine informatii despre assemblies (ansambluri), obiecte, clase, metode, parametrii etc prin folosirea metadata. Cu ajutorul Reflection pot fi modificate/accesate respectivele informatii in timpul executiei: create obiecte, executate metode, schimbate proprietati, atasarea la evenimente etc.
Acum o sa postez cateva exemple de utilizarea Reflection, urmand ca in viitor sa postez scurte tutoriale cu explicatii mai detaliate si complexitate mai mare.
Pentru toate exemplele prezentate aici trebuie inclus la inceputul codului:
using System.Reflection;
Pentru inceput, avem un obiect, si vreau sa ii vad toate proprietatile. Functia urmatoare face asta:
public static string[] GetProperies(object ctrl) { if (ctrl == null) throw new Exception("cannot get properties for a null object."); Type t = ctrl.GetType(); PropertyInfo[] propList = t.GetProperties(); string[] str = new string[propList.Length]; for (int i = 0; i < propList.Length; i++) str[i] = propList[i].Name; Array.Sort(str); return str; }
Functia primeste ca parametru un obiect, si returneaza (ca array) toate proprieatile obiectului respectiv. Daca este folosit un obiect complex, de tipul Button, se obtine o lista lunga de proprietati.
Modificarea “din zbor” a unei astfel de proprietati se realizeaza simlu:
public static void SetProperty(PropertyInfo p, object ctrl, object value) { p.SetValue(ctrl, value, null); }
unde value trebuie sa aiba acelasi tip cu p.PropertyType
Pentru a afisa toate metodele publice ale unui obiect se procedeaza in felul urmator:
public static void ListMethods(object ctrl) { Type t = ctrl.GetType(); MethodInfo[] methods = t.GetMethods(); foreach (MethodInfo m in methods) { Console.WriteLine(m.Name); } }
si un ultim exemplu: executarea folosind reflection a unei metode, metoda fara parametri (cazul invocarii unei metode care accepta parametrii presupune folosirea unui obiect[] care sa contina parametrii metodei repsective):
public static void ExecMethod(object ctrl, MethodInfo mi) { mi.Invoke(ctrl,null) ; }
Un exemplu de folosire a Reflexion in practica in curand…