首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态调用方法

动态调用方法
EN

Stack Overflow用户
提问于 2015-10-21 17:29:23
回答 1查看 661关注 0票数 1

我试图动态地调用方法,但我有问题。有人能帮忙吗?

我有以下的vb代码

代码语言:javascript
运行
复制
Module
    Sub Main
        if user-input = RP1 then
            createRP1()
        elseif user-input = RP2 then 
            createRP2()
        end if
    end sub

    sub createRP1()
        ...
    end sub

    sub createRP2()
        ,...
    end sub

End Module

CreateRP1/CreateRP2方法没有任何参数。有一些报告。因此,我不想写所有这些如果或切换条件的这一点。我想写一些简单的东西,所以我试了一下

代码语言:javascript
运行
复制
1 Dim type As Type = "["GetType"]"()
2 Dim method As MethodInfo = type.GetMethod("Create" + user-input)
3 If method IsNot Nothing Then
4     method.Invoke(Me, Nothing)
5 End If

第1行和第4行不起作用

第4行无法工作,因为"me“不与模块一起使用。但是如何重写1呢?我在StackOverflow网站的某个地方看到了这个

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-21 18:38:12

您可以像这样获得当前TypeModule

代码语言:javascript
运行
复制
 Dim myType As Type = MethodBase.GetCurrentMethod().DeclaringType

由于它是一个Module,所以所有方法本质上都是Shared (例如,静态的、非实例的方法),所以您只需为MethodInfo.Invoke方法的obj参数传递Nothing

代码语言:javascript
运行
复制
 Dim methodName As String = "Create" & userInput
 Dim method As MethodInfo = myType.GetMethod(methodName)
 method.Invoke(Nothing, Nothing)

但是,与其使用反射,您可能还需要考虑使用委托字典,以便在编译时更具有确定性和类型检查。例如:

代码语言:javascript
运行
复制
Dim methods As New Dictionary(Of String, Action)
methods.Add("RP1", AddressOf CreateRP1)
methods.Add("RP2", AddressOf CreateRP1)
' ...
methods(userInput).Invoke()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33265649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档