考虑这个来自WinForms应用程序的代码示例:
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;
}
}
当你点击按钮1时,控制台会打印出“Something good happened”的结果,这是预期的。
现在考虑下面这段代码示例,它与前面的示例相同,唯一不同之处在于它使用反射机制调用了DoSomething
函数:
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;
}
}
在mi.Invoke(null, parms)
这行上抛出了一个System.ArgumentException
(对象类型'System.String'无法转换为类型'System.Object[]')。
parms显然是一个对象数组,而DoSomething方法的签名也明确期望一个对象数组。那么为什么调用会将数组中的第一个对象取出并尝试传递它呢?
或者还有其他我不理解的情况吗?