01 |
В данной статье речь пойдет о «вынужденном» позднем связывании. Предположим, что у нас есть класс MyClass и у него есть функции MyFunc1, MyFunc2, MyFunc3. И нам необходимо получить результат функции, при этом мы имеем лишь её название в виде String-переменной — "MyFunc1". Для того чтобы это сделать воспользуемся классом MethodInfo: |
|
02 | На заметку: |
Необходимо иметь ввиду, что вызываемая функция (в нашем случае MyFunc1) должна быть объявлена публичной — Public, иначе вызвать её не получится. Для обращения к методам имеющим видимость Private необходимо использовать флаг BindingFlags — BindingFlags.NonPublic.
|
|
03 | VB.NET |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 Imports System.Reflection
Module Module1
Sub Main() ... Private Function ВызватьМетодЕслиОнЕсть(ByRef objSource As Object, ByRef methodName As String, ByVal params As Object()) As Object ... Public Class [MyClass] ... |
|
04 |
Необходимо иметь ввиду, что нельзя путать массив параметров-объектов с параметром-массивом. Предположим, у нас есть функция принимающая в качестве параметра, например, строковый массив. При попытке в эту функцию, в качестве параметра, передать строковый параметр-массив не обернутый в объектный массив будет вызвана ошибка: |
|
05 | VB.NET |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 Dim params As String() = {"John", "Michael", "Sarah"}
Dim result = ВызватьМетодЕслиОнЕсть(Me, "MyFunction", params) ' Так будет сгенерирована ошибка
Dim result = ВызватьМетодЕслиОнЕсть(Me, "MyFunction", {params}) ' Нужно строковый массив обернуть в объектный массив параметров
Private Function ВызватьМетодЕслиОнЕсть(ByRef objSource As Object, ByRef methodName As String, ByVal params As Object()) As Object ... Public Function MyFunction(ByVal params As String()) As String ... |
|
06 |
Также, обязательно необходимо учитывать, что при обращении к методу, имеющему перегруженные варианты, необходимо указывать дополнительный параметр Types() — иначе ошибка AmbiguousMatchException (Обнаружено неоднозначное соответствие)! |
|
07 | VB.NET |
1 2 3 4 5 6 7 8 9 10 11 'В случае существования перегруженного метода, необходимо указать на параметры, иначе - Ambiguous Match Exception!
Public Function ВызватьМетодЕслиОнЕсть(ByRef objSource As Object, ByRef methodName As String, ByVal types() As Type, ByVal params() As Object) As Object ... |
|
08 |
Результат будет выглядеть следующим образом: |
|
09 | VB.NET |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 Imports System.Reflection
Module Module1
Sub Main() ... Public Class AnyClass ... Public Class ExtMethods ... |
|
10 |
О доступе к свойствам класса по имени можно почитать в статье Как получить свойство класса по его имени (строковой переменной String). |
|
12 |
Похожие запросы:
|
|