[Reflection] 使用 Reflection 呼叫參數中有 params 的方法

筆記:如何使用 Reflection 呼叫參數中帶有 params 類型不定個數參數的方法。

今天在寫程式,要做動態呼叫帶有 params 的參數的方法時,我撰寫了下列的程式:

public class Program3
{
    static void Main(params string[] args)
    {
        try
        {
            MyClass cls = new MyClass();

            MethodInfo methodAddInfo = cls.GetType().GetMethod("Add");
            Console.WriteLine("Add(x, y) : {0}",
               methodAddInfo.Invoke(cls, new object[] { 5, 2 }));

            methodAddInfo = cls.GetType().GetMethod("AddNumberList");
            Console.WriteLine("AddNumberList(num_list) : {0}", 
               methodAddInfo.Invoke(cls, new object[] { 1, 2, 3, 4, 5, 6, 7, 8 }));

            cls = null;
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);
        }

        Console.ReadLine();
    }

}

public class MyClass
{
    public int Add(int X, int Y)
    {
        return X + Y;
    }

    // 有帶 params 不定個數參數的函式
    public int AddNumberList(params int[] NumberList)
    {
        int sum = 0;

        foreach (int num in NumberList)
            sum += num;

        return sum;
    }
}

但是卻出現了下列的訊息:

 

錯誤發生在帶有 params 參數的那一個方法,我試想可能 Reflection 將 params 型的參數設定為單一個參數類型,因此我把傳入的參數重新整理成: 

Console.WriteLine("AddNumberList(num_list) : {0}",
    methodAddInfo.Invoke(cls, new object[] { new int[] { 1, 2, 3, 4, 5, 6, 7, 8 } }));

再重跑後,即可成功。