要用Reflection呼叫方法,需先取得MethodInfo,接著用MethodInfo.Invoke(object obj, object[] parameters)指定物件個體及引數(Parameter,或稱參數)陣列。不過如果引數屬傳址性質,傳入後預期會被修改,程式該怎麼寫?

廢話不多說,直接看Code:

using System;
using System.Net;
using System.Reflection;
 
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstName = null, lastName = null;
            MethodInfo mi = 
                typeof(Boo).GetMethod("Parse", 
                    BindingFlags.Static | BindingFlags.NonPublic);
            //宣告一個object[] { }
            object[] p = new object[] { "Jeffrey Lee", firstName, lastName };
            //靜態方法,Invoke時第一個參數傳null即可
            mi.Invoke(null, p);
            //執行完畢,但屬ref傳址的firstName, lastName並未被改變
            Console.WriteLine("First Name = {0}, Last Name = {1}",
                firstName, lastName);
            //正確做法,object[]中ref參數值會被換掉,可由其中取得結果
            Console.WriteLine("First Name = {0}, Last Name = {1}",
                p[1], p[2]);
 
            Console.Read();
            
        }
    }
 
    public class Boo
    {
        //傳入姓名,拆解成姓跟名,以ref方式傳回結果
        private static void Parse(string fullName, 
            ref string firstName, ref string lastName)
        {
            string[] p = fullName.Split(' ');
            firstName = p[0];
            if (p.Length > 1)
                lastName = p[1];
        }
    }
}

Comments

# by Cappella

黑暗大你好,請問如果 Reflection呼叫方法時,傳入的參數是一個Class 應該要如何處理? 我是動態加載 DLL後,呼叫其內部的一個方法,但是該方法傳入的參數是該 DLL的另一個Class ...

# by Jeffrey

to Cappella, 可使用Assembly.GetType("type_name")取得參數Class的型別,再用Activator.CreateInstance()動態建立物件當成參數傳給該方法。

# by Cappella

感謝黑暗大 提供關鍵字 "Activator.CreateInstance()"

Post a comment


61 + 1 =