C# 動態取得和執行方法

先建立一個測試類別,等一下會動態取得這個類別的所有方法和動態執行方法
    
public class TestClass
{
    public void Method1()
    {
        Console.WriteLine(nameof(Method1));
    }

    public string Method2()
    {
        Console.WriteLine(nameof(Method2));
        return nameof(Method2);
    }

    public int Method3(int x, int y)
    {
        Console.WriteLine(nameof(Method3));
        return x + y;
    }
    
    public static void StaticMethod()
    {
        Console.WriteLine(nameof(StaticMethod));
    }
}
    

動態取得所有方法

    
MethodInfo[] methodInfos = typeof(TestClass).GetMethods();
foreach (MethodInfo methodInfo in methodInfos)
{
    Console.WriteLine(methodInfo.Name);
}

/* 輸出:
Method1
Method2
Method3
StaticMethod
GetType
ToString
Equals
GetHashCode
*/
    

從上面輸出內容可以發現除了我們建立的方法 Method1, Method2, Method3 以外還多了 GetType, ToString, Equals, GetHashCode 這些類別基本的方法,那有沒有辦法不要這些呢?
    
MethodInfo[] methodInfos = typeof(TestClass).GetMethods();
foreach (MethodInfo methodInfo in methodInfos)
{
    if (methodInfo.DeclaringType != typeof(TestClass)) continue;
    Console.WriteLine(methodInfo.Name);
}

/* 輸出:
Method1
Method2
Method3
StaticMethod
*/
    

動態執行方法

動態執行靜態方法

    
var methodInfo = typeof(TestClass).GetMethod("StaticMethod");
methodInfo?.Invoke(null, null);
    

如果是非靜態的方法會拋出下面的錯誤:
    
Unhandled exception. System.Reflection.TargetException: Non-static method requires a target.
   at System.Reflection.MethodBase.ValidateInvokeTarget(Object target)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Program.<Main>$(String[] args) in C:\Users\ruyut\ConsoleAppDynamicMethodTest\ConsoleAppDynamicMethodTest\Program.cs:line 2
    

動態執行非靜態方法

    
var methodInfo = typeof(TestClass).GetMethod("Method1");
methodInfo?.Invoke(new TestClass(), null); // 需要先實例化
    

動態執行非靜態方法並取得回傳值

    
var methodInfo = typeof(TestClass).GetMethod("Method2");
var result = methodInfo?.Invoke(new TestClass(), null); // 需要先實例化
Console.WriteLine((string)result);
    

傳入參數以動態執行非靜態方法並取得回傳值

    
var methodInfo = typeof(TestClass).GetMethod("Method3");
var result = methodInfo?.Invoke(new TestClass(), new object[] { 1, 2 }); // 需要先實例化
Console.WriteLine((int)result);
    

留言