использование метода Reflector.Invoke для функций с необязательными параметрами - PullRequest
0 голосов
/ 31 октября 2008

Я пытаюсь использовать отражатель. 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 ]

2 голосов
/ 26 ноября 2008

Компилятор Visual Basic фактически подставляет необязательные значения параметров в вызывающий код. Так что, если ваш фактический код был:

DoSomeStuff(blah1, blah2)

Visual Basic выдал бы код IL, эквивалентный:

DoSomeStuff(blah1, blah2, "45")

Чтобы узнать, что это за последний параметр, вам нужно получить ссылку на объект параметра (я не уверен, что это такое в Reflector - в .NET вы получите доступ к MethodInfo, а затем к ParameterInfo), затем получите его пользовательские атрибуты, ища атрибут, помеченный с помощью OptionalAttribute и DefaultParameterValueAttribute. Затем вам нужно вызвать его с третьим параметром, предоставив значение из DefaultParameterValueAttribute.

0 голосов
/ 26 ноября 2008

Я бы перегрузил метод 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
...