也许有人可以帮我解决这个问题。
我编写了一个后台任务,可以从数据库中获取几个工作人员。 在数据库中,我向每个worker添加了应调用的函数的名称。
但我不知道如何从vb.net调用该函数。
如果你们中的某个人可以给我一个提示,那就太棒了。)
感谢 干杯 亚瑟
答案 0 :(得分:1)
命名空间System.Reflection有许多启用此功能的方法,例如this one:
来自MSDN,上面链接中的示例:
Imports System
Imports System.Reflection
Public Class MagicClass
Private magicBaseValue As Integer
Public Sub New()
magicBaseValue = 9
End Sub
Public Function ItsMagic(preMagic As Integer) As Integer
Return preMagic * magicBaseValue
End Function
End Class
Public Class TestMethodInfo
Public Shared Sub Main()
' Get the constructor and create an instance of MagicClass
Dim magicType As Type = Type.GetType("MagicClass")
Dim magicConstructor As ConstructorInfo = magicType.GetConstructor(Type.EmptyTypes)
Dim magicClassObject As Object = magicConstructor.Invoke(New Object(){})
' Get the ItsMagic method and invoke with a parameter value of 100
Dim magicMethod As MethodInfo = magicType.GetMethod("ItsMagic")
Dim magicValue As Object = magicMethod.Invoke(magicClassObject, New Object(){100})
Console.WriteLine("MethodInfo.Invoke() Example" + vbNewLine)
Console.WriteLine("MagicClass.ItsMagic() returned: {0}", magicValue)
End Sub
End Class
'示例程序提供以下输出:
'
' MethodInfo.Invoke() Example
'
' MagicClass.ItsMagic() returned: 900
答案 1 :(得分:1)
我建议您在应用程序代码中使用代理词典。将密钥存储在数据库中,而不是函数名称中。从数据库中检索密钥时,请在字典中查找它,如果存在,则执行它。您不希望允许根据存储在数据库中的名称执行任意方法。
它们的键可以是字符串或整数。我更喜欢后者只是为了节省空间和简化查找,但是字符串可能更容易调试。所以你有一个这样的字典:
Private m_WorkerDelegates As New Dictionary(Of String, Action)()
在其他地方,您可以填写可用的工人:
m_WorkerDelegates.Add("worker1", AddressOf WorkerMethod1)
m_WorkerDelegates.Add("worker2", AddressOf WorkerMethod2)
然后,从数据库中检索时,您需要在字典中查找该方法:
Public Sub ExecuteWorker(ByVal row As DataRow)
Dim key As String = CStr(row("worker_key"))
If Not m_WorkerDelegates.ContainsKey(key) Then
' either throw exception or report the error in some more effective way '
Throw New Exception("Invalid worker key specified")
End If
' actually call the worker method '
m_WorkerDelegates(key)()
End Sub