Reflection呼叫方法時如何使用ref引數?
3 |
要用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()"