对带有可选参数的函数使用Reflection.Invoke方法

时间:2008-10-31 00:40:56

标签: vb.net reflector

我正在尝试使用reflector.InvokeMethod来调用带有可选参数的函数。 该函数如下所示:

Private Function DoSomeStuff(ByVal blah1 as string, ByVal blah2 as string, Optional ByVal blah3 as string = "45") as boolean
'stuff
end function

我正在调用它:

Dim result As Boolean = Reflector.InvokeMethod(AccessModifier.private,obj_of_Class, "DoSomeStuff", Param1, Param2, Param3)

这个工作正常,除了我没有传递第三个(可选)参数时,它不会命中该函数。

Dim result As Boolean = Reflector.InvokeMethod(AccessModifier.private,obj_of_Class, "DoSomeStuff", Param1, Param2)

有没有办法可以使用Reflector.invokeMethod调用此函数而不传递可选参数?或另一种方法来实现这一目标?

2 个答案:

答案 0 :(得分:2)

Visual Basic编译器实际上将可选参数值替换为调用代码。因此,如果您的实际代码是:

DoSomeStuff(blah1, blah2)

Visual Basic将发出相当于以下内容的IL代码:

DoSomeStuff(blah1, blah2, "45")

要知道最后一个参数是什么,你需要获得对参数对象的引用(我不确定Reflector中是什么 - 在.NET中你可以访问MethodInfo然后到ParameterInfo),然后获取其自定义属性,查找标有OptionalAttribute和DefaultParameterValueAttribute的属性。然后,您需要使用第三个参数调用它,从DefaultParameterValueAttribute提供值。

答案 1 :(得分:0)

我会重载 DoSomeStuff 方法,而不是使用可选参数......

Private Overloads Function DoSomeStuff(ByVal blah1 As String, ByVal blah2 As String) As Boolean
    Return DoSomeStuff(blah1, blah2, "45")
End Function

Private Overloads Function DoSomeStuff(ByVal blah1 As String, ByVal blah2 As String, ByVal blah3 As String) As Boolean
    'stuff
End Function