C# 極短篇 - Reflection Invoke() 包含選擇性參數的方法
1 |
分享這幾天寫程式學到的 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阿! 長知識了。