Tenir compte cet exemple de code à partir d'une application WinForms:Pourquoi la méthode Invoke échoue-t-elle avec l'argument argument?
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
object[] parms = new object[1];
parms[0] = "foo";
DoSomething(parms);
}
public static string DoSomething(object[] parms)
{
Console.WriteLine("Something good happened");
return null;
}
}
Il fonctionne comme prévu, lorsque vous cliquez sur button1 il imprime « Quelque chose est arrivé » à la console.
considèrent maintenant cet exemple de code, qui est le même, sauf qu'il invoque DoSomething
utilisant la réflexion:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
object[] parms = new object[1];
parms[0] = "foo";
System.Reflection.MethodInfo mi = typeof(Form1).GetMethod("DoSomething");
mi.Invoke(null, parms);
}
public static string DoSomething(object[] parms)
{
Console.WriteLine("Something good happened");
return null;
}
}
Il jette un System.ArgumentException
sur la ligne mi.Invoke(null, parms)
(objet de type « System.String » ne peut pas être converti en tapez 'System.Object []'.)
Parms est clairement un tableau d'objets, et la signature de la méthode DoSomething attend clairement un tableau d'objets. Alors pourquoi invoquer tire-t-il le premier objet hors du tableau et essaye-t-il de le passer à la place?
Ou est quelque chose d'autre que je ne comprends pas?
Cela est logique parfait maintenant - bien sûr, il fonctionne de cette façon. Il est temps de s'éloigner du clavier pendant quelques minutes :-) – GojiraDeMonstah