我正在使用与旧数据库系统连接的第三方库。有一种方法 - CallProg
调用“存储过程”(缺少更好的翻译 - 人群中的任何Pick用户?)。但是,而不是做这样的事情:
Public Sub CallProg(ProgName, ParamArray ProgArgs() As String)
...
End Sub
甚至是这样:
Public Sub CallProg(ProgName, Optional Arg1 As String, Optional Arg2 As String ... Optional Arg20 As String)
他们这样做了:
Public Sub CallProg(ProgName)
Public Sub CallProg(ProgName, Arg1 As String)
Public Sub CallProg(ProgName, Arg1 As String, Arg2 As String)
Public Sub CallProg(ProgName, Arg1 As String, Arg2 As String, Arg3 As String)
...
Public Sub CallProg(ProgName, Arg1 As String, ... Arg20 As String)
我正在编写一个抽象类来处理登录,设置环境等,因此它可以在许多其他项目中用作通用的“帮助程序”类。有没有办法包装不涉及20次重载的CallProg
子?
答案 0 :(得分:0)
这是一个如何使用反射来快速了解它的想法。我不确定它是否是最佳方式,但应该有效......
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
CallProg("ProgName", {"testArg1", "TestArg2"})
End Sub
Private Sub CallProg(ByVal ProgName As String, ByVal Params As IEnumerable(Of String))
Dim testClass As New Test1
Dim methodTypes As List(Of Type) =
Params.Select(Function(x) GetType(String)).ToList
methodTypes.Add(GetType(String))
Dim methodToBeCalled As Reflection.MethodInfo =
testClass.GetType.GetMethod("CallProg",
System.Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.Public,
Type.DefaultBinder,
methodTypes.ToArray,
Nothing)
Dim paramsToPass As New List(Of String)
paramsToPass.Add(ProgName)
paramsToPass.AddRange(Params)
methodToBeCalled.Invoke(testClass, paramsToPass.ToArray)
End Sub
结束班
Public Class Test1
Public Sub CallProg(ByVal ProgName As String)
Debug.WriteLine("Sub0 called")
End Sub
Public Sub CallProg(ByVal ProgName As String, ByVal Arg1 As String)
Debug.WriteLine("Sub1 called")
End Sub
Public Sub CallProg(ByVal ProgName As String, ByVal Arg1 As String, ByVal Arg2 As String)
Debug.WriteLine("Sub2 called")
End Sub
Public Sub CallProg(ByVal ProgName As String, ByVal Arg1 As String, ByVal Arg2 As String, ByVal Arg3 As String)
Debug.WriteLine("Sub3 called")
End Sub
结束班
答案 1 :(得分:0)
另一种方法来做Rene147建议:
Private _act As New APIClass
Public Sub CallProg(ByVal ProgName As String, ByVal ParamArray ProgArgs() As String)
Try
Dim tList As New List(Of Type)
tList.Add(GetType(String))
Dim aList As New List(Of String)
aList.Add(ProgName)
For Each arg In ProgArgs
tList.Add(GetType(String).MakeByRefType)
'tList.Add(GetType(String)) <-- only use this if all the args are ByVal
aList.Add(arg)
Next
Dim typeList As Type() = tList.ToArray
Dim argList As String() = aList.ToArray
GetType(APIClass).GetMethod("CallProg", typeList).Invoke(_act, argList)
Catch ex As Exception
Console.Write("Error running program {0}.", ProgName)
End Try
End Sub