0

我正在尝试使用 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 来调用这个函数而不传递可选参数?或其他方式来实现这一目标?

4

2 回答 2

2

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

DoSomeStuff(blah1, blah2)

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

DoSomeStuff(blah1, blah2, "45")

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

于 2008-11-25T23:06:13.373 回答
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
于 2008-11-25T22:57:33.643 回答