CSharp:Reflection
From Aino Wiki
La Reflection è la possibilità di gestire codice (leggendo i metadati) al fine di trovare assembly, moduli, tipi in modo dinamico, runtime. Con la Reflection si è in grado di:
- ottenere dettagli di un oggetto/metodo
- creare oggetti, invocare metodi in esecuzione, dinamicamente.
Il namespace da usare è System.Reflection
che contiene classi, interfacce e metodi necessari. Ad es. il metodo GetType()
fornisce il modo di avere il tipo di un oggetto.
La Reflection mediante esempi
Argomento vasto ma indispensabile. E' sparso qua e là nel presente Wiki dedicato a C#, in questa sezione inizio a trattarlo in modo specifico ed in futuro in modo pragmatico. Seguono esempi di reflection organizzati per argomento.
Chiamare metodo mediante stringhe
Da stackoverflowusing System.Reflection; ... private void BtnRun1_Click(object sender, EventArgs e) { string commandString = string.Empty; Type thisType = this.GetType(); commandString = "WriteInLabel"; MethodInfo theMethod = thisType.GetMethod(commandString); //Non serve qui ma il seguente ci da informazioni sui parametri del metodo da invocare ParameterInfo[] parameterInfo = theMethod.GetParameters(); object[] objUserParameters = new object[] { }; theMethod.Invoke(this, objUserParameters); } public void WriteInLabel() { LblTest1.Text = "Uno"; }
Altro modo più elegante.
using System.Reflection; ... public void Invoke<T>(string methodName) where T : new() { T instance = new T(); MethodInfo method = typeof(T).GetMethod(methodName); method.Invoke(instance, null); }
Esempio usando metodo con un parametro. Il parametro è passato mediante tipo object con new[] { "world" }:
public class Test { public void Hello(string s) { Console.WriteLine("hello " + s); } } ... { Test t = new Test(); typeof(Test).GetMethod("Hello").Invoke(t, new[] { "world" }); // alternative if you don't know the type of the object: t.GetType().GetMethod("Hello").Invoke(t, new[] { "world" }); }