#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() {})