In un precedente Tip abbiamo già visto come funziona il sistema di
Reflection, in questo Tip vedremo come richiamare un metodo da una classe ad unaltra utilizzando la classe
Methodinfo.
Come esempio useremo questa semplice classe utente che ha due proprietà e due metodi con un metodo che ha due parametri di input e uno nessuno parametro:
namespace Test
{
public class Utente
{
private string _nome;
public string Nome
{
get
{
return _nome;
}
set
{
_nome = value;
}
}
private string _cognome;
public string Cognome
{
get
{
return _cognome;
}
set
{
_cognome = value;
}
}
public Utente()
{
}
public void GetNominativo(string nome, string cognome)
{
Console.WriteLine("Cognome {0} Nome{1}",this.Cognome,this.Cognome);
Console.ReadLine();
}
public void ScriviCiaoCommunity()
{
Console.WriteLine("Ciao Community");
}
} // end class - Utente
} // end namespace
Ora da un'altra classe richiamiamo il primo metodo passando i due parametri:
Come prima cosa bisogna importare il namespace della Reflection
System.Reflection.
C#Utente utente = new Utente();
Type typeUtente = utente.GetType();
MethodInfo method = typeUtente.GetMethod("GetNominativo",BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);
method.Invoke(utente,new object[]{"Marco","Caruso"});
VB.NETDim utente as New Utente()
Dim typeUtente as Type = utente.GetType();
Dim method as MethodInfo = typeUtente.GetMethod("GetNominativo",BindingFlags.Instance Or BindingFlags.Public Or BindingFlags.IgnoreCase)
method.Invoke(utente,new object[]{"Marco","Caruso"});
Analizziamo il codice:
Come prima cosa instanzio la classe dove è inserito il metodo, poi recupero il
Type della classe.
Il metodo
"GetMethod" della classe
System.Type accetta come parametri:
Il nome del parametro
Gli attributi che consentono di specificare le modalità desecuzione della ricerca che sono rappresentati dallenumerazione BindingFlags
Nel nostro caso abbiamo detto alla reflection di cercare i metodi che fanno parte dellinstanza(BindingFlags.Instance), i metodo dichiarati come public e di ignorare la differenza tra maiuscole e minuscole(BindingFlags.IgnoreCase)
Infine tramite
Invoke abbiamo richiamato il metodo, dicendogli chi è il proprietario e i parametri che devono essere passati come array di object.