先建立一個測試類別,等一下會動態取得這個類別的所有方法和動態執行方法
從上面輸出內容可以發現除了我們建立的方法 Method1, Method2, Method3 以外還多了 GetType, ToString, Equals, GetHashCode 這些類別基本的方法,那有沒有辦法不要這些呢?
如果是非靜態的方法會拋出下面的錯誤:
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);
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com