将20个重载的子组合成一个

时间:2012-01-31 20:50:10

标签: vb.net

我正在使用与数据库系统连接的第三方库。有一种方法 - 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子?

2 个答案:

答案 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