Вызов метода, когда имя метода содержится в строке

#asp.net #vb.net #reflection

#asp.net #vb.net #отражение

Вопрос:

Допустим, у меня есть страница Test.aspx вместе с test.aspx.vb.

Test.aspx.vb содержит имя класса «TestClass». В этом классе у меня есть method1(), method2() и method3()

Мне нужно иметь возможность вызывать один из этих методов, но я не могу его жестко запрограммировать, метод, который будет выполняться, исходит из строки.

Я не могу сделать

 Select Case StringContainingTheNameOfTheDesiredMethod
    Case "Method1" 
        Method1()
    Case "Method2"
       Method2()
end case
  

.

Что я мог бы найти, как сделать с отражением (я последовал этому примеру). Моя проблема в том, что этим методам может потребоваться взаимодействовать с test.aspx, но когда я использую .invoke, кажется, создается новый поток или контекст, и любая ссылка на test.aspx становится нулевой (установка label1.text = «something» создаст нулевую ссылку, но прямой вызов method1(без вызова) отлично обновит label1.text .

Есть ли какое-либо решение? Кто-нибудь может дать мне несколько советов?

Комментарии:

1. Что именно вы не можете жестко запрограммировать? Строка метода или сам вызов метода?

2. Единственное решение, которое я могу найти, это вызвать метод, который возвращает объект, и использовать этот объект в качестве источника данных для взаимодействия с test.aspx, но поскольку все методы уже находятся в test.aspx.vb, было бы проще, если бы я мог просто взаимодействовать с test.aspx в рамках этих методов.

3. Мне нужно найти способ избежать вызова этого оператора select case (или if)? метод. У меня есть строка, содержащая имя метода, который необходимо вызвать, в идеальном мире я бы просто сделал что-то вроде excecuteMethod(stringwithmethod name)

4. Метод отражения — это способ сделать это. Вам нужно уточнить, что означает потеря ссылки на test.aspx .

Ответ №1:

Вам нужно передать экземпляр тестовой страницы Invoke методу (чтобы вы его вызывали on the object ). Извините за код C # 😉

 MethodInfo method = typeof(TestPage).GetMethod(StringContainingTheNameOfTheDesiredMethod);
method.Invoke(this, null);
  

Комментарии:

1. Ну, это помогло мне найти ответ, но это не точный ответ… итак, я поддержал ваш комментарий и ответ.

2. Возможно, вы захотите дополнить свой вопрос окончательным решением, чтобы помочь другим.

Ответ №2:

     Dim xAssembly As Assembly = Assembly.GetExecutingAssembly()

    Dim xClass As Object = xAssembly.CreateInstance("Paradox.Intranet2.ManageUsers", False, BindingFlags.ExactBinding, Nothing, New Object() {}, Nothing, Nothing)
    Dim xMethod As MethodInfo = xAssembly.GetType("Paradox.Intranet2.ManageUsers").GetMethod("TestCallFromString")

    Dim ret As Object = xMethod.Invoke(Me, New Object() {})