我正在尝试动态调用方法,但我遇到了问题。可以请一些人帮忙
我有以下vb代码
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方法没有任何参数。有很多报告。所以我不想写所有那些if或切换条件。我想写一些简单的东西,所以我尝试了这个
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行无效,因为“我”不适用于模块。但如何重写1?我在StackOverflow网站的某个地方看到了这个
答案 0 :(得分:2)
您可以像这样获取当前Type
的{{1}}:
Module
由于它是 Dim myType As Type = MethodBase.GetCurrentMethod().DeclaringType
,所有方法基本上都是Module
(例如静态,非实例方法),因此您可以为Shared
传递Nothing
obj
方法的参数:
MethodInfo.Invoke
但是,您可能还需要考虑使用委托字典,以便在编译时更加确定并进行类型检查,而不是使用反射。例如:
Dim methodName As String = "Create" & userInput
Dim method As MethodInfo = myType.GetMethod(methodName)
method.Invoke(Nothing, Nothing)
答案 1 :(得分:0)
我认为最好的解决方案是通过设计一个类来创建一个“Report”对象。然后你可以轻松地动态制作东西。
function (byRef user-input As String) As Report
if not "s" & user-input = "s"
Dim user-report As Report = new Report(user-input)
end if
end function
然后是您的报告类
Private reportNumber As String
Private data As String
Public Sub New(byVal reportNumber As String)
Sub createRP(byRef repotNumber As String)
// use report # here to select the correct data...
// so if it was sql....
// "SELECT data FROM report_table where report_num =" & reportNumber
end Sub
end Sub