從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 它打印「好東西發生」到控制檯。
現在考慮此代碼示例,這是相同的,除了它調用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.String」的System.ArgumentException
不能轉換到鍵入'System.Object []'。)
parms顯然是一個對象數組,而DoSomething的方法簽名顯然是期待一個對象數組。那麼爲什麼調用將第一個對象從數組中拉出並試圖通過它呢?
還是別的什麼事情,我不理解?
這使得現在完美的意義 - 當然它工作的方式。時間離開鍵盤幾分鐘:-) – GojiraDeMonstah