寫這篇博客,原起今天CyljXu問我一個問題:如何通過反射調用帶有ref或者out的參數的方法?想着可能其他人也會遇到這個問題,權且記錄下來,以備后行者搜索到。
這個在MSDN上有解釋,參考 MethodBase.Invoke方法 。
public
Object Invoke( Object obj, Object[] parameters)
參數
obj 類型:System . Object對其調用方法或構造函數的對象。如果方法是靜態的,則忽略此參數。如果構造函數是靜態的,則此參數必須為 null 引用(在 Visual Basic
中為 Nothing )
或定義該構造函數的類的實例。
類型: System.Object[]
調用的方法或構造函數的參數列表。這是一個對象數組,這些對象與要調用的方法或構造函數的參數具有相同的數量、順序和類型。如果沒有任何參數,則 parameters 應為 null 引用(在 Visual Basic 中為 Nothing ) 。
如果此實例所表示的方法或構造函數采用 ref
參數(在 Visual Basic 中為 ByRef
),使用此函數調用該方法或構造函數時, 該參數不需要任何特殊屬性
。如果數組中的對象未用值來顯式初始化,則該對象將包含該對象類型的默認值。對於引用類型的元素,該值為 null 引用(在 Visual Basic
中為 Nothing ) 。對於值類型的元素,該值為 0、0.0 或
false
,具體取決於特定的元素類型。
1
class
Program
2
{
3
static
void
Main(
string
[] args)
4
{
5
string
content
=
"
main
"
;
//
#1 variable
6
MethodInfo testMethod
=
typeof
(Program).GetMethod(
"
TestMethod
"
,
7
BindingFlags.Static
|
BindingFlags.NonPublic);
8
if
(testMethod
!=
null
)
9
{
10
//
Following way can not take content back.
11
//
-------------------------------------
12
testMethod.Invoke(
null
,
new
object
[] { content
/*
#1 variable
*/
});
13
Console.WriteLine(content);
//
#1 variable, Output is: main
14
//
-------------------------------------
15
16
17
object
[] invokeArgs
=
new
object
[] { content
/*
#1 variable
*/
};
18
testMethod.Invoke(
null
, invokeArgs);
19
content
=
(
string
)invokeArgs[
0
];
//
#2 variable, bypass from invoke, set to content.
20
Console.WriteLine(content);
//
#2 variable, Output is: test
21
}
22
}
23
24
static
void
TestMethod(
ref
string
arg)
25
{
26
arg
=
"
test
"
;
//
#2 variable, wanna bypass to main process.
27
}
28
}
