分享這幾天寫程式學到的 System.Reflection 小技巧一枚:使用 Type.GetMethod() 於執行期間取得類別的靜態方法,方法包含選擇性參數。以強型別呼叫,選擇性參數可省略不寫,.NET 會帶入預設值;但透過 MethodInfo.Invoke() 呼叫時,object[] 參數陣列若省略選擇性參數會出現「Parmater count mismatch」錯誤,解法為在選擇性參數位置填入 Type.Missing,程式示範如下:

using System;
using System.Reflection;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var m = typeof(Foo).GetMethod("Show",
                BindingFlags.Public | BindingFlags.Static);
            try
            {
                //第三個參數i為選擇性,但Invoke忽略會出錯
                //錯誤訊息:Parameter count mismatch.
                m.Invoke(null, new object[] { "A", true });
            }
            catch(Exception e)
            {
                Console.WriteLine($"Error - {e.Message}");
            }
            //Invoke()時選擇性參數不可省略,但可傳Type.Missing使用預設值
            m.Invoke(null, new object[] { "A", false, Type.Missing });

            Console.ReadLine();
        }
    }

    public class Foo
    {
        public static void Show(string s, bool b, int i = 9527)
        {
            Console.WriteLine($"Show: s={s},b={b},i={i}");
        }
    }
}

測試結果:

Simple example of how to invoke a method with optional parameter


Comments

# by ByTIM

之前學過UNITY,曾用過Invoke調用函式,C#竟然也有Invoke阿! 長知識了。

Post a comment