- Код: Выделить всё
Overloads Public Function Invoke( _
ByVal obj As Object, _
ByVal parameters() As Object _
) As Object
Параметры
obj
Экземпляр, который создал этот метод.
parameters
Список аргументов для вызываемого метода или конструктора. Этот список представляет собой массив объектов с таким же количеством, последовательностью и типом элементов, что и у параметров вызываемого метода или конструктора. Если параметров нет, должно быть передано значение пустая ссылка (Nothing в Visual Basic).
Если метод или конструктор, представленный этим экземпляром, принимает параметр по ссылке (ByRef), для вызова с помощью этого параметра метода или конструктора, таким образом, не требуется никаких специальных атрибутов. Любой объект в этом массиве, который явно не инициализирован некоторым значением, будет содержать стандартное значение, установленное для данного объектного типа. Для элементов, передаваемых по ссылке это значение равно пустой ссылке (Nothing). Для элементов, передаваемых по значению, это значение равно 0, 0,0 или false, в зависимости от типа элемента.
Возвращаемое значение
Объект Object, содержащий возвращаемое значение вызванного метода, или (для случая конструктора) вновь инициализированный объект.
Примечания
Этот метод следует использовать для вызова методов со стандартными значениями параметров. Для связывания этих методов отражение требует, чтобы один из флагов связывания DefaultValueBinding, DefaultValueChangeType или DefaultValueFull был задан явно. Это требование справедливо даже в случаях, когда значение передается для параметра, имеющего стандартное значение.
Например, рассмотрим метод MyMethod(int x, float y = 2.0). Чтобы вызывать этот метод только с первым аргументом, скажем, MyMethod (4), следует передать один из упомянутых выше флагов связывания и два аргумента, а именно, 4 для первого аргумента и Missing.Value для второго аргумента. Кроме использования Missing.Value, посредством метода Invoke можно не опускать необязательные параметры. В этом случае следует использовать вызов InvokeMember.
Этот удобный метод вызывает следующий метод Invoke, передавая в качестве остальных параметров значение пустая ссылка (Nothing в Visual Basic). Если вызванный метод создает исключение, метод GetBaseException возвращает исключение.
При вызове статического метода с помощью его объекта MethodInfo первый параметр должен иметь значение пустой ссылке (Nothing), как показано в следующем вызове:
- Код: Выделить всё
Object myReturnValue = myMethodInfo.Invoke(null, myParametersArray)
Пример
В следующих примерах демонстрируется динамический поиск средствами отражения. Обратите внимание, что все вызовы возвращают 1, так как метод в классах A и B является виртуальным (Overridable в Visual Basic).
- Код: Выделить всё
Public Class A
Public Overridable Function method() As Integer
Return 0
End Function
End Class
Public Class B
Public Overridable Function method() As Integer
Return 1
End Function
End Class
Class Mymethodinfo
Public Shared Function Main() As Integer
Console.WriteLine("Reflection.MethodInfo")
Console.WriteLine()
Dim MyA As New A()
Dim MyB As New B()
'Get the Type and MethodInfo
Dim MyTypea As Type = Type.GetType("A")
Dim Mymethodinfoa As MethodInfo = MyTypea.GetMethod("method")
Dim MyTypeb As Type = Type.GetType("B")
Dim Mymethodinfob As MethodInfo = MyTypeb.GetMethod("method")
'Get and display the Invoke method
Console.WriteLine("First method - {0} returns {1}", MyTypea.FullName, _
Mymethodinfoa.Invoke(MyA, Nothing).ToString())
Console.WriteLine("Second method - {0} returns {1}", MyTypeb.FullName, _
Mymethodinfob.Invoke(MyB, Nothing).ToString())
Return 0
End Function
End Class
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас